Submission #1267756

#TimeUsernameProblemLanguageResultExecution timeMemory
1267756enzyRailway Trip 2 (JOI22_ho_t4)C++20
35 / 100
1644 ms104040 KiB
#pragma GCC optimize("O3") #pragma GCC taeget("avx2") #include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; const int inf=1e9+7; const int maxk=18; int esq[maxn][maxk], dir[maxn][maxk], seg[3*maxn][2], aux_seg[3*maxn][maxk][2], lz[3*maxn][2], aux_lz[3*maxn][maxk][2]; void refresh(int id, int ini, int fim, int oq){ if(ini!=fim){ int e=2*id, d=2*id+1; if(!oq){ lz[e][oq]=min(lz[e][oq],lz[id][oq]); lz[d][oq]=min(lz[d][oq],lz[id][oq]); }else{ lz[e][oq]=max(lz[e][oq],lz[id][oq]); lz[d][oq]=max(lz[d][oq],lz[id][oq]); } } if(!oq){ seg[id][oq]=min(seg[id][oq],lz[id][oq]); lz[id][oq]=inf; }else{ seg[id][oq]=max(seg[id][oq],lz[id][oq]); lz[id][oq]=0; } } void update(int id, int ini, int fim, int l, int r, int val, int oq){ refresh(id,ini,fim,oq); if(ini>r||fim<l) return; if(l<=ini&&fim<=r){ if(!oq) lz[id][oq]=min(lz[id][oq],val); else lz[id][oq]=max(lz[id][oq],val); refresh(id,ini,fim,oq); return; } int mid=(ini+fim)/2, e=2*id, d=2*id+1; update(e,ini,mid,l,r,val,oq); update(d,mid+1,fim,l,r,val,oq); if(!oq) seg[id][oq]=min(seg[e][oq],seg[d][oq]); else seg[id][oq]=max(seg[e][oq],seg[d][oq]); } int query(int id, int ini, int fim, int l, int r, int oq){ refresh(id,ini,fim,oq); if(ini>r||fim<l){ if(!oq) return inf; else return 0; } if(l<=ini&&fim<=r) return seg[id][oq]; int mid=(ini+fim)/2, e=2*id, d=2*id+1; if(!oq) return min(query(e,ini,mid,l,r,oq),query(d,mid+1,fim,l,r,oq)); return max(query(e,ini,mid,l,r,oq),query(d,mid+1,fim,l,r,oq)); } void aux_refresh(int id, int ini, int fim, int b, int oq){ if(ini!=fim){ int e=2*id, d=2*id+1; if(!oq){ aux_lz[e][b][oq]=min(aux_lz[e][b][oq],aux_lz[id][b][oq]); aux_lz[d][b][oq]=min(aux_lz[d][b][oq],aux_lz[id][b][oq]); }else{ aux_lz[e][b][oq]=max(aux_lz[e][b][oq],aux_lz[id][b][oq]); aux_lz[d][b][oq]=max(aux_lz[d][b][oq],aux_lz[id][b][oq]); } } if(!oq){ aux_seg[id][b][oq]=min(aux_seg[id][b][oq],aux_lz[id][b][oq]); aux_lz[id][b][oq]=inf; }else{ aux_seg[id][b][oq]=max(aux_seg[id][b][oq],aux_lz[id][b][oq]); aux_lz[id][b][oq]=0; } } void aux_update(int id, int ini, int fim, int l, int r, int val, int b, int oq){ aux_refresh(id,ini,fim,b,oq); if(ini>r||fim<l) return; if(l<=ini&&fim<=r){ if(!oq) aux_lz[id][b][oq]=min(aux_lz[id][b][oq],val); else aux_lz[id][b][oq]=max(aux_lz[id][b][oq],val); aux_refresh(id,ini,fim,b,oq); return; } int mid=(ini+fim)/2, e=2*id, d=2*id+1; aux_update(e,ini,mid,l,r,val,b,oq); aux_update(d,mid+1,fim,l,r,val,b,oq); if(!oq) aux_seg[id][b][oq]=min(aux_seg[e][b][oq],aux_seg[d][b][oq]); else aux_seg[id][b][oq]=max(aux_seg[e][b][oq],aux_seg[d][b][oq]); } int aux_query(int id, int ini, int fim, int l, int r, int b, int oq){ aux_refresh(id,ini,fim,b,oq); if(ini>r||fim<l){ if(!oq) return inf; else return 0; } if(l<=ini&&fim<=r) return aux_seg[id][b][oq]; int mid=(ini+fim)/2, e=2*id, d=2*id+1; if(!oq) return min(aux_query(e,ini,mid,l,r,b,oq),aux_query(d,mid+1,fim,l,r,b,oq)); return max(aux_query(e,ini,mid,l,r,b,oq),aux_query(d,mid+1,fim,l,r,b,oq)); } void solve(int n){ int s, t; cin >> s >> t; int resp=0, l=s, r=s; if(s>t||dir[s][maxk-1]<t) cout << -1 << endl; else{ for(int b=maxk-1;b>=0;b--){ int nl=s, nr=aux_query(1,1,n,l,r,b,1); if(nl>t||nr<t){ l=nl; r=nr; resp+=(1<<b); } } cout << resp+1 << endl; } } int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n, k, m; cin >> n >> k >> m; for(int i=0;i<3*n;i++){ for(int b=0;b<maxk;b++) aux_seg[i][b][1]=aux_lz[i][b][1]=0; seg[i][1]=lz[i][1]=0; } for(int i=1;i<=n;i++){ update(1,1,n,i,i,i,1); } for(int i=1;i<=m;i++){ int a, b; cin >> a >> b; if(a<b) update(1,1,n,a,min(a+k-1,b),b,1); } for(int i=1;i<=n;i++){ esq[i][0]=i; dir[i][0]=query(1,1,n,i,i,1); aux_update(1,1,n,i,i,dir[i][0],0,1); } for(int b=1;b<maxk;b++){ for(int i=1;i<=n;i++){ int l=esq[i][b-1], r=dir[i][b-1]; esq[i][b]=i; dir[i][b]=aux_query(1,1,n,l,r,b-1,1); aux_update(1,1,n,i,i,dir[i][b],b,1); } } int q; cin >> q; while(q--) solve(n); }
#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...