제출 #531717

#제출 시각아이디문제언어결과실행 시간메모리
531717errorgornRailway Trip 2 (JOI22_ho_t4)C++17
100 / 100
512 ms70940 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define ll long long
#define ii pair<ll,ll>
#define fi first
#define se second

#define puf push_front
#define pof pop_front
#define pub push_back
#define pob pop_back
#define lb lower_bound
#define ub upper_bound

#define rep(x,s,e) for (auto x=(s)-((s)>(e));x!=(e)-((s)>(e));((s)<(e))?x++:x--)
#define all(x) (x).begin(),(x).end()
#define sz(x) (int) (x).size()

mt19937 rng(chrono::system_clock::now().time_since_epoch().count());

struct ST{ //sparse table
	int arr[100005][18];
	
	ST(vector<int> v){
		rep(x,0,sz(v)) arr[x][0]=v[x];
		
		int layer=1;
		int curr=1;
		
		while (curr<100005){
			rep(x,0,100005-curr){
				arr[x][layer]=max(arr[x+curr][layer-1],arr[x][layer-1]);
			}
			
			layer++;
			curr<<=1;
		}
	}
	
	int query(int i,int j){
		int len=31-__builtin_clz(j-i+1);
		return max(arr[i][len],arr[j-(1<<len)+1][len]);
	}
};

struct ST2{ //sparse table
	int arr[100005][18];
	
	ST2(vector<int> v){
		rep(x,0,sz(v)) arr[x][0]=v[x];
		
		int layer=1;
		int curr=1;
		
		while (curr<100005){
			rep(x,0,100005-curr){
				arr[x][layer]=min(arr[x+curr][layer-1],arr[x][layer-1]);
			}
			
			layer++;
			curr<<=1;
		}
	}
	
	int query(int i,int j){
		int len=31-__builtin_clz(j-i+1);
		return min(arr[i][len],arr[j-(1<<len)+1][len]);
	}
};

int n,m,k,q;
vector<ii> fwd;
vector<ii> bwd;

#define iii pair<ii,int>
set<iii> s;

void ins(int l,int r,int v){
	auto it=--s.lb({{l+1,-1},-1});
	
	while (it!=s.end() && (*it).fi.fi<=r){
		iii temp=(*it);
		it++;
		
		s.erase(temp);
		if (temp.fi.fi<l) s.insert({{temp.fi.fi,l-1},temp.se});
		if (r<temp.fi.se) s.insert({{r+1,temp.fi.se},temp.se});
	}
	
	s.insert({{l,r},v});
}

ii tkd[100005][18]; //points to the guy that can go the furthest (l,r)

vector<int> vl,vr;
ii conv(int l,int r,int layer){
	int l2,r2;
	int temp1,temp2;
	
	tie(temp1,temp2)={
		tkd[l][layer].fi,
		tkd[r][layer].fi
	};
	if (vl[temp1]<vl[temp2]) l2=temp1;
	else l2=temp2;
	
	tie(temp1,temp2)={
		tkd[l][layer].se,
		tkd[r][layer].se
	};
	if (vr[temp1]>vr[temp2]) r2=temp1;
	else r2=temp2;
	
	return {l2,r2};
}

signed main(){
	cin.tie(0);
	cout.tie(0);
	cin.sync_with_stdio(false);
	
	cin>>n>>k>>m;
	
	int a,b;
	rep(x,0,m){
		cin>>a>>b;
		
		if (a<b) fwd.pub({a,b});
		else bwd.pub({b,a});
	}
	
	s.clear();
	rep(x,0,n+1) s.insert(iii(ii(x,x),x));
	sort(all(fwd),[](ii i,ii j){
		return i.se<j.se;
	});
	for (auto it:fwd) ins(it.fi,min(it.se,it.fi+k-1),it.se);
	for (auto it:s) rep(x,it.fi.fi,it.fi.se+1) vr.pub(it.se);
	ST R=ST(vr);
	
	s.clear();
	rep(x,0,n+1) s.insert(iii(ii(x,x),x));
	sort(all(bwd),[](ii i,ii j){
		return i.fi>j.fi;
	});
	for (auto it:bwd) ins(max(it.fi,it.se-k+1),it.se,it.fi);
	for (auto it:s) rep(x,it.fi.fi,it.fi.se+1) vl.pub(it.se);
	ST2 L=ST2(vl);
	
	//rep(x,1,n+1) cout<<vl[x]<<" "; cout<<endl;
	//rep(x,1,n+1) cout<<vr[x]<<" "; cout<<endl;
	
	rep(x,1,n+1){ //furthest right guy
		int lo=vl[x]-1,hi=vr[x],mi;
		int val=R.query(vl[x],vr[x]);
		
		while (hi-lo>1){
			mi=hi+lo>>1;
			if (R.query(vl[x],mi)!=val) lo=mi;
			else hi=mi;
		}
		
		tkd[x][0].se=hi;
	}
	rep(x,1,n+1){ //furthest left guy
		int lo=vl[x],hi=vr[x]+1,mi;
		int val=L.query(vl[x],vr[x]);
		
		while (hi-lo>1){
			mi=hi+lo>>1;
			if (L.query(mi,vr[x])!=val) hi=mi;
			else lo=mi;
		}
		
		tkd[x][0].fi=lo;
	}
	
	//rep(x,1,n+1) cout<<vl[x]<<" "; cout<<endl;
	//rep(x,1,n+1) cout<<vr[x]<<" "; cout<<endl;
	//rep(x,1,n+1) cout<<tkd[x][0].fi<<" "<<tkd[x][0].se<<endl;
	
	rep(x,1,18){
		rep(y,1,n+1){
			tkd[y][x]=conv(tkd[y][x-1].fi,tkd[y][x-1].se,x-1);
		}
	}
	
	cin>>q;
	while (q--){
		cin>>a>>b;
		
		int l=a,r=a;
		int ans=1;
		rep(x,18,0){
			int l2,r2;
			tie(l2,r2)=conv(l,r,x);
			
			if (b<vl[l2] || vr[r2]<b){
				ans+=(1<<x);
				l=l2;
				r=r2;
			}
		}
		
		if (b<vl[l] || vr[r]<b){
			tie(l,r)=conv(l,r,0);
			ans++;
		}
		if (b<vl[l] || vr[r]<b) ans=-1;
		
		cout<<ans<<endl;
	}
}

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'int main()':
Main.cpp:160:9: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  160 |    mi=hi+lo>>1;
      |       ~~^~~
Main.cpp:172:9: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  172 |    mi=hi+lo>>1;
      |       ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...