제출 #1307719

#제출 시각아이디문제언어결과실행 시간메모리
1307719vtnooRailway Trip 2 (JOI22_ho_t4)C++20
100 / 100
1401 ms85400 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]; 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]); } }; segt mn[LOG],mx[LOG]; void chmin(int &a,int b){ if(a>b)a=b; } void chmax(int &a,int b){ if(a<b)a=b; } 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),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()); } mn[0].init(INF,0),mx[0].init(-INF,1); fore(j,0,n){ mx[0].upd(j,R[j]==-INF?j:R[j]); mn[0].upd(j,L[j]==INF?j:L[j]); } fore(i,1,LOG){ mn[i].init(INF,0),mx[i].init(-INF,1); vector<int>v1,v2; fore(j,0,n){ v1.pb(mn[i-1].que(j,j)); v2.pb(mx[i-1].que(j,j)); } fore(j,0,n){ int l=v1[j],r=v2[j]; mn[i].upd(j,mn[i-1].que(l,r)); mx[i].upd(j,mx[i-1].que(l,r)); } } int Q;cin>>Q; while(Q--){ int s,t;cin>>s>>t;s--;t--; int l=s,r=s,ans=0; for(int i=LOG-1;i>=0;i--){ int nxtl=mn[i].que(l,r),nxtr=mx[i].que(l,r); if(nxtl>t||nxtr<t){ l=nxtl;r=nxtr; ans+=(1<<i); } } int nxtl=mn[0].que(l,r),nxtr=mx[0].que(l,r); //~ cout<<nxtl<<" "<<nxtr<<endl; if(nxtl<=t&&t<=nxtr){ cout<<ans+1<<endl; }else cout<<-1<<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...