Submission #934997

#TimeUsernameProblemLanguageResultExecution timeMemory
934997koukirocksRailway Trip 2 (JOI22_ho_t4)C++17
52 / 100
2049 ms117248 KiB
#include <bits/stdc++.h> #define speed ios_base::sync_with_stdio(0); cin.tie(0) #define all(x) (x).begin(),(x).end() using namespace std; typedef long long ll; typedef double db; typedef long double ldb; typedef pair<int,int> pii; typedef pair<ll,ll> pll; const ll MAX=1e5+10,P=998244353; const ll INF=0x3f3f3f3f,oo=0x3f3f3f3f3f3f3f3f; int n,k,m; vector<pii> trn[2]; struct SegTreeMin{ int tree[MAX*4]; int lazy[MAX*4]; void init(int l,int r,int id) { if (l==r) { tree[id]=l; lazy[id]=INF; return; } int m=l+r>>1; init(l,m,id<<1); init(m+1,r,id<<1|1); tree[id]=min(tree[id<<1],tree[id<<1|1]); lazy[id]=INF; } void pd(int l,int r,int id) { if (lazy[id]!=INF) { lazy[id<<1]=min(lazy[id<<1],lazy[id]); lazy[id<<1|1]=min(lazy[id<<1|1],lazy[id]); tree[id<<1]=min(tree[id<<1],lazy[id]); tree[id<<1|1]=min(tree[id<<1|1],lazy[id]); lazy[id]=INF; } } void update(int val,int L,int R,int l=1,int r=n,int id=1) { // cout<<l<<" "<<r<<" "<<val<<" upd\n"; if (L<=l and r<=R) { tree[id]=min(tree[id],val); lazy[id]=min(lazy[id],val); return; } int m=l+r>>1; pd(l,r,id); if (L<=m) update(val,L,R,l,m,id<<1); if (m<R) update(val,L,R,m+1,r,id<<1|1); tree[id]=min(tree[id<<1],tree[id<<1|1]); } int query(int L,int R,int l=1,int r=n,int id=1) { // cout<<l<<" "<<r<<" "<<dir<<" "<<id<<" q\n"; if (L<=l and r<=R) return tree[id]; int m=l+r>>1; pd(l,r,id); int ans=INF; if (L<=m) ans=min(ans,query(L,R,l,m,id<<1)); if (m<R) ans=min(ans,query(L,R,m+1,r,id<<1|1)); return ans; } }; struct SegTreeMax{ int tree[MAX*4]; int lazy[MAX*4]; void init(int l,int r,int id) { if (l==r) { tree[id]=l; lazy[id]=0; return; } int m=l+r>>1; init(l,m,id<<1); init(m+1,r,id<<1|1); tree[id]=max(tree[id<<1],tree[id<<1|1]); lazy[id]=0; } void pd(int l,int r,int id) { if (lazy[id]!=0) { lazy[id<<1]=max(lazy[id<<1],lazy[id]); lazy[id<<1|1]=max(lazy[id<<1|1],lazy[id]); tree[id<<1]=max(tree[id<<1],lazy[id]); tree[id<<1|1]=max(tree[id<<1|1],lazy[id]); lazy[id]=0; } } void update(int val,int L,int R,int l=1,int r=n,int id=1) { if (L<=l and r<=R) { tree[id]=max(tree[id],val); lazy[id]=max(lazy[id],val); return; } int m=l+r>>1; pd(l,r,id); if (L<=m) update(val,L,R,l,m,id<<1); if (m<R) update(val,L,R,m+1,r,id<<1|1); tree[id]=max(tree[id<<1],tree[id<<1|1]); } int query(int L,int R,int l=1,int r=n,int id=1) { // cout<<l<<" "<<r<<" "<<id<<" q\n"; if (L<=l and r<=R) { // cout<<l<<" "<<r<<" "<<tree[id]<<"\n"; return tree[id]; } int m=l+r>>1; pd(l,r,id); int ans=0; if (L<=m) ans=max(ans,query(L,R,l,m,id<<1)); if (m<R) ans=max(ans,query(L,R,m+1,r,id<<1|1)); return ans; } }; SegTreeMin lft[18]; SegTreeMax rt[18]; bool extend(int &l,int &r,int t,int k) { int nl=lft[k].query(l,r),nr=rt[k].query(l,r); // cout<<nl<<" "<<nr<<" nl nr\n"; if (nl<=t and t<=nr) return false; l=nl;r=nr; return true; } int main() { speed; cin>>n>>k; cin>>m; for (int i=0;i<m;i++) { int a,b; cin>>a>>b; trn[(a<b)].emplace_back(a,b); } for (int i=0;i<18;i++) { lft[i].init(1,n,1); rt[i].init(1,n,1); } for (pii i:trn[0]) { int s=i.first,t=i.second; lft[0].update(t,max(t,s-k+1),s); // cout<<max(t,s-k+1)<<" "<<s<<" "<<t<<" lft\n"; } // for (int i=1;i<=n;i++) cout<<lft[0].query(i,i)<<" "; // cout<<"\n"; // for (int i=1;i<=n;i++) cout<<rt[0].query(i,i)<<" "; // cout<<"\n"; for (pii i:trn[1]) { int s=i.first,t=i.second; rt[0].update(t,s,min(t,s+k-1)); // cout<<s<<" "<<min(t,s+k-1)<<" "<<t<<" rt\n"; } // cout<<rt[0].query(3,5)<<" vvdfbgsdgbsgf\n"; for (int k=1;k<18;k++) { for (int i=1;i<=n;i++) { // cout<<k<<" "<<i<<" ki\n"; int farlft=lft[k-1].query(i,i),farrt=rt[k-1].query(i,i); // cout<<farlft<<" "<<farrt<<" lr\n"; // cout<<lft[k-1].query(farlft,farrt)<<" "<<rt[k-1].query(farlft,farrt)<<" lr rslt\n"; lft[k].update(lft[k-1].query(farlft,farrt),i,i); rt[k].update(rt[k-1].query(farlft,farrt),i,i); } } // for (int k=0;k<18;k++) { // for (int i=1;i<=n;i++) cout<<lft[k].query(i,i)<<" "; // cout<<"\n"; // for (int i=1;i<=n;i++) cout<<rt[k].query(i,i)<<" "; // cout<<"\n\n"; // } cout<<flush; int q; cin>>q; while (q--) { int s,t; cin>>s>>t; int l=s,r=s; ll ans=0; for (int k=18-1;k>=0;k--) { bool suc=extend(l,r,t,k); if (suc) ans+=(1<<k); // cout<<k<<" "<<suc<<" ksuc\n"; } if (!extend(l,r,t,0)) cout<<ans+1<<"\n"; else cout<<"-1\n"; } return 0; }

Compilation message (stderr)

Main.cpp: In member function 'void SegTreeMin::init(int, int, int)':
Main.cpp:27:10: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   27 |   int m=l+r>>1;
      |         ~^~
Main.cpp: In member function 'void SegTreeMin::update(int, int, int, int, int, int)':
Main.cpp:49:10: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   49 |   int m=l+r>>1;
      |         ~^~
Main.cpp: In member function 'int SegTreeMin::query(int, int, int, int, int)':
Main.cpp:58:10: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   58 |   int m=l+r>>1;
      |         ~^~
Main.cpp: In member function 'void SegTreeMax::init(int, int, int)':
Main.cpp:76:10: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   76 |   int m=l+r>>1;
      |         ~^~
Main.cpp: In member function 'void SegTreeMax::update(int, int, int, int, int, int)':
Main.cpp:97:10: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   97 |   int m=l+r>>1;
      |         ~^~
Main.cpp: In member function 'int SegTreeMax::query(int, int, int, int, int)':
Main.cpp:109:10: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  109 |   int m=l+r>>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...