Submission #20754

#TimeUsernameProblemLanguageResultExecution timeMemory
20754aintaShortcut (IOI16_shortcut)C++14
0 / 100
0 ms105720 KiB
#include "shortcut.h" #include<stdio.h> #include<algorithm> #include<vector> #define N_ 1010000 #define SZ 1048576 #define pll pair<long long, long long> using namespace std; int n; long long LD[N_], RD[N_], S[N_], P[N_], IT1[SZ+SZ], IT2[SZ+SZ], TL; long long LT[N_], RT[N_]; int RR[N_], LL[N_]; long long Max1(int b, int e){ long long r = -1e18; b+=SZ;e+=SZ; while(b<=e){ r=max(r,max(IT1[b],IT1[e])); b=(b+1)>>1,e=(e-1)>>1; } return r; } long long Max2(int b, int e){ long long r = -1e18; b+=SZ,e+=SZ; while(b<=e){ r=max(r,max(IT2[b],IT2[e])); b=(b+1)>>1,e=(e-1)>>1; } return r; } long long st[1010000][2]; bool Pos(long long d){ if(LD[n]<=d)return true; int i, pv = n, ppv = 1; long long Mx = 0; for(i=1;i<=n;i++){ if(LD[i] > d){RR[i]=-1;continue;} if(i!=1){ while(1){ long long Len = S[pv]-S[i]+TL, mm; if(ppv < i)ppv = i; if(ppv > pv)ppv = pv; while((S[ppv+1]-S[i])*2 <= Len && ppv+1<=pv) ppv++; while((S[ppv]-S[i])*2 > Len)ppv--; mm = Max1(i,ppv) + Mx; if(ppv<pv) mm = max(mm,Max2(ppv+1,pv) + Mx + S[pv]+S[i]+TL); if(mm > d) pv--; else break; } } RR[i] = pv; Mx = max(Mx, P[i]-S[i]); } Mx = 0, pv = 1, ppv = n; for(i=n;i>=1;i--){ if(RD[i] > d){LL[i]=-1;continue;} if(i!=n){ while(1){ long long Len = S[i]-S[pv]+TL, mm; if(ppv > i)ppv = i; if(ppv < pv)ppv = pv; while((S[i]-S[ppv-1])*2 <= Len && ppv-1>=pv) ppv--; while((S[i]-S[ppv])*2 > Len)ppv++; mm = Max2(ppv,i) + Mx; if(ppv>pv) mm = max(mm,Max1(pv,ppv-1) + Mx - S[pv]-S[i]+TL); if(mm > d) pv++; else break; } } LL[i] = pv; Mx = max(Mx, P[i]+S[i]); } long long ML = 1e18; int top = 0; for(i=1;i<=n;i++){ if(top && st[1][0] + P[i] + S[i] > d){ int bb = 1, ee = top, rr=0, mid; while(bb<=ee){ mid=(bb+ee)>>1; if(st[mid][0]+P[i]+S[i]>d){ rr = mid; bb = mid + 1; } else ee = mid-1; } ML = min(ML, d - (st[rr][1] + P[i] - S[i])); } while(top && P[i]-S[i] >= st[top][0])top--; top++; st[top][0]=P[i]-S[i]; st[top][1]=P[i]+S[i]; } pv = 1; for(i=1;i<n;i++){ pv=max(pv,i); while(pv+1<=n && S[pv+1]-S[i]+TL <=ML)pv++; if(i == pv || RR[i]==-1 || LL[pv]==-1)continue; if(RR[i] < pv || LL[pv] > i)continue; if(LT[i] + RT[pv] - (S[pv]-S[i]) + TL <= d)return true; } return false; } long long find_shortcut(int N, vector<int> l, vector<int> d, int c) { TL = c; n = N; int i; for(i=1;i<=n;i++){ if(i!=1)S[i] = S[i-1] + l[i-2]; P[i] = d[i-1]; } long long mx = 0; for(i=1;i<=n;i++){ LD[i] = max(LD[i-1], mx+S[i]+P[i]); mx = max(mx, P[i]-S[i]); LT[i] = mx; } mx = S[n]; for(i=n;i>=1;i--){ RD[i] = max(RD[i+1], mx-S[i]+P[i]); mx = max(mx, P[i]+S[i]); RT[i] = mx; int t = i+SZ; IT1[t] = S[i]+P[i], IT2[t] = P[i]-S[i]; while(t!=1){ t>>=1; IT1[t] = max(IT1[t+t],IT1[t+t+1]); IT2[t] = max(IT2[t+t],IT2[t+t+1]); } } long long b = 0, e = LD[n], mid, res = 0; while(b<=e){ mid = (b+e)/2; if(Pos(mid)){ res = mid; e = mid - 1; } else b = mid + 1; } return res; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...