제출 #1307712

#제출 시각아이디문제언어결과실행 시간메모리
1307712vtnooRailway Trip 2 (JOI22_ho_t4)C++20
25 / 100
591 ms41248 KiB
#include <bits/stdc++.h> #define pb push_back #define fst first #define snd second #define fore(i,a,b) for(int i=a,pao=b;i<pao;++i) #define SZ(x) ((int)x.size()) #define ALL(x) x.begin(),x.end() #define me(a,v) memset((a),(v),sizeof(a)) #define FIN ios::sync_with_stdio(0);cin.tie(0);cout.tie(0) using namespace std; typedef long long ll; const int MAXM=2e5+5,MAXN=1e5+5,LOG=19,INF=1e9; int A[MAXM],B[MAXM],L[MAXN],R[MAXN]; vector<int>upr[LOG],upl[LOG]; int n; struct segt{ int st[MAXN*4],NEUT,OPER; void init(int a,int b){ NEUT=a,OPER=b; fill(st,st+MAXN*4,NEUT); } int op(int a,int b){ if(OPER)return max(a,b); else return min(a,b); } void upd(int p,int x,int v=1,int s=0,int e=n-1){ if(s==e){st[v]=x;return;} int m=(s+e)/2; if(p<=m)upd(p,x,v*2,s,m); else upd(p,x,v*2+1,m+1,e); st[v]=op(st[v*2],st[v*2+1]); } int que(int ts,int te,int v=1,int s=0,int e=n-1){ if(e<ts||te<s)return NEUT; if(ts<=s&&e<=te){ return st[v]; } int m=(s+e)/2; return op(que(ts,te,v*2,s,m),que(ts,te,v*2+1,m+1,e)); } void build(vector<int>&a,int v=1,int s=0,int e=n-1){ if(s==e){st[v]=a[s];return;} int m=(s+e)/2; build(a,v*2,s,m); build(a,v*2+1,m+1,e); st[v]=op(st[v*2],st[v*2+1]); } }; void chmin(int &a,int b){ if(a>b)a=b; } void chmax(int &a,int b){ if(a<b)a=b; } int jump(int a,int k,int r){ fore(i,0,LOG){ if((1<<i)&k){ if(r)a=upr[i][a]; else a=upl[i][a]; } } return a; } int main(){FIN; int k;cin>>n>>k; int m;cin>>m; fill(L,L+n,INF); fill(R,R+n,-INF); vector<vector<int>>add(n),rem(n); vector<vector<int>>add2(n),rem2(n); fore(i,0,m){ cin>>A[i]>>B[i]; A[i]--;B[i]--; if(A[i]<B[i]){ add[A[i]].pb(B[i]); if(min(A[i]+k,B[i]+1)<n)rem[min(A[i]+k,B[i]+1)].pb(B[i]); }else{ add2[A[i]].pb(B[i]); if(max(A[i]-k,B[i]-1)>=0)rem2[max(A[i]-k,B[i]-1)].pb(B[i]); } } multiset<int>s; fore(i,0,n){ if(!s.empty())for(auto x:rem[i])s.erase(s.find(x)); for(auto x:add[i])s.insert(x); if(!s.empty())chmax(R[i],*s.rbegin()); } s.clear(); for(int i=n-1;i>=0;i--){ if(!s.empty())for(auto x:rem2[i])s.erase(s.find(x)); for(auto x:add2[i])s.insert(x); if(!s.empty())chmin(L[i],*s.begin()); } fore(i,0,LOG){ upr[i].resize(n); upl[i].resize(n); } fore(j,0,n){ upr[0][j]=R[j]==-INF?j:R[j]; upl[0][j]=L[j]==INF?j:L[j]; } fore(i,1,LOG){ segt mn,mx;mn.init(INF,0),mx.init(-INF,1); mn.build(upl[i-1]);mx.build(upr[i-1]); fore(j,0,n){ int alcr=upr[i-1][j],alcl=upl[i-1][j]; if(alcr>j)upr[i][j]=mx.que(j,upr[i-1][j]); else upr[i][j]=alcr; if(alcl<j)upl[i][j]=mn.que(upl[i-1][j],j); else upl[i][j]=alcl; } } int Q;cin>>Q; while(Q--){ int s,t;cin>>s>>t;s--;t--; int l=-1,r=(1<<LOG); int caso=s<t?1:0; if(caso){ while(r-l>1){ int m=(r+l)/2; if(jump(s,m,caso)>=t){ r=m; }else l=m; } if(r==(1<<LOG))cout<<-1<<endl; else cout<<r<<endl; } else{ while(r-l>1){ int m=(r+l)/2; if(jump(s,m,caso)<=t){ r=m; }else l=m; } if(r==(1<<LOG))cout<<-1<<endl; else cout<<r<<endl; } } }
#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...