Submission #1266355

#TimeUsernameProblemLanguageResultExecution timeMemory
1266355syanvuRailway Trip 2 (JOI22_ho_t4)C++20
16 / 100
1080 ms589824 KiB
#include <bits/stdc++.h> // #include <ext/pb_ds/assoc_container.hpp> // #include <ext/pb_ds/tree_policy.hpp> #define SS ios_base::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr); #pragma optimize("g", on) #pragma GCC optimize("03") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,avx2,mmx,fma,avx,tune=native") #define int long long #define all(x) x.begin(),x.end() #define F first #define S second using namespace std; // using namespace __gnu_pbds; // #define ordered_set tree<int,null_type,less_equal<int>,rb_tree_tag,tree_order_statistics_node_update> const int LG = 21,N = 2e5+1,inf = 1e18,MOD = 998244353; const double eps = 1e-9; int T; int n,k,m; int lt[4*N],ladd[4*N],rt[4*N],radd[4*N]; int l[N][LG],r[N][LG],dpl[LG][N][LG],dpr[LG][N][LG]; void build(int v,int tl,int tr){ lt[v]=ladd[v]=0; rt[v]=radd[v]=inf; if(tl==tr) return; int mid=(tl+tr)/2; build(v*2,tl,mid); build(v*2+1,mid+1,tr); } void push(int v,int tl,int tr){ lt[v]=max(lt[v],ladd[v]); if(tl<tr){ ladd[v*2]=max(ladd[v*2],ladd[v]); ladd[v*2+1]=max(ladd[v*2+1],ladd[v]); } ladd[v]=0; rt[v]=min(rt[v],radd[v]); if(tl<tr){ radd[v*2]=min(radd[v*2],radd[v]); radd[v*2+1]=min(radd[v*2+1],radd[v]); } radd[v]=inf; } void lupd(int v,int tl,int tr,int l,int r,int x){ push(v,tl,tr); if(tl>r || l>tr) return; if(tl>=l && r>=tr){ ladd[v]=max(ladd[v],x); push(v,tl,tr); return; } int mid=(tl+tr)/2; lupd(v*2,tl,mid,l,r,x); lupd(v*2+1,mid+1,tr,l,r,x); lt[v]=max(lt[v*2],lt[v*2+1]); } void rupd(int v,int tl,int tr,int l,int r,int x){ push(v,tl,tr); if(tl>r || l>tr) return; if(tl>=l && r>=tr){ radd[v]=min(radd[v],x); push(v,tl,tr); return; } int mid=(tl+tr)/2; rupd(v*2,tl,mid,l,r,x); rupd(v*2+1,mid+1,tr,l,r,x); rt[v]=min(rt[v*2],rt[v*2+1]); } int lget(int v,int tl,int tr,int pos){ push(v,tl,tr); if(tl==tr) return lt[v]; int mid=(tl+tr)/2; if(mid>=pos) return lget(v*2,tl,mid,pos); else return lget(v*2+1,mid+1,tr,pos); } int rget(int v,int tl,int tr,int pos){ push(v,tl,tr); if(tl==tr) return rt[v]; int mid=(tl+tr)/2; if(mid>=pos) return rget(v*2,tl,mid,pos); else return rget(v*2+1,mid+1,tr,pos); } void solve() { cin>>n>>k>>m; int a[m+1],b[m+1]; build(1,1,n); for(int i=1;i<=m;i++){ cin>>a[i]>>b[i]; if(a[i]<b[i]) lupd(1,1,n,a[i],min(a[i]+k-1,b[i]-1),b[i]); else rupd(1,1,n,max(a[i]-k+1,b[i]+1),a[i],b[i]); } for(int i=1;i<=n;i++){ int L=rget(1,1,n,i),R=lget(1,1,n,i); l[i][0]=min(L,i); r[i][0]=max(R,i); } auto getmn = [&](int t,int l,int r){ int lg=log2(r-l+1); return min(dpl[t][l][lg],dpl[t][r-(1ll<<lg)+1][lg]); }; auto getmx = [&](int t,int l,int r){ int lg=log2(r-l+1); return max(dpr[t][l][lg],dpr[t][r-(1ll<<lg)+1][lg]); }; for(int lg=0;lg<LG;lg++){ if(lg){ for(int i=1;i<=n;i++){ l[i][lg]=getmn(lg-1,l[i][lg-1],r[i][lg-1]); r[i][lg]=getmx(lg-1,l[i][lg-1],r[i][lg-1]); } } for(int i=1;i<=n;i++){ dpl[lg][i][0]=l[i][lg]; dpr[lg][i][0]=r[i][lg]; } for(int j=1;j<LG;j++){ for(int i=1;i+(1ll<<j)-1<=n;i++){ dpl[lg][i][j]=min(dpl[lg][i][j-1],dpl[lg][i+(1ll<<(j-1))][j-1]); dpr[lg][i][j]=max(dpr[lg][i][j-1],dpr[lg][i+(1ll<<(j-1))][j-1]); } } } int q; cin>>q; while(q--){ int s,t; cin>>s>>t; int L=s,R=s; int ans=0; for(int i=20;i>=0;i--){ int _l=getmn(i,L,R); int _r=getmx(i,L,R); if(_l>t || _r<t){ L=_l; R=_r; ans+=(1ll<<i); } } cout<<(ans+1>n ? -1 : ans+1)<<'\n'; } return; } signed main() { // freopen("deleg.in","r",stdin); // freopen("deleg.out","w",stdout); SS int t = 1; if (T) { cin >> t; } while (t--) { solve(); } } /* */
#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...