Submission #1031851

#TimeUsernameProblemLanguageResultExecution timeMemory
1031851kymShortcut (IOI16_shortcut)C++14
31 / 100
2083 ms476 KiB
#ifndef LOCAL #include "shortcut.h" #endif #include <bits/stdc++.h> using namespace std; #define int long long const int maxn=3005; int X[maxn]; vector<int32_t> L, D; int C; int n; const int oo = 1'000'000'000'000'000'000ll; typedef pair<int,int>pi; int c1[maxn],c2[maxn]; struct node{ int tree[4*maxn]; void update(int node, int s, int e, int x, int nval){ if(s==e){ tree[node]=nval; return; } int m=(s+e)/2; if(x<=m)update(node<<1,s,m,x,nval); else update(node<<1|1,m+1,e,x,nval); tree[node]=max(tree[node<<1],tree[node<<1|1]); } int query(int node, int s, int e, int x, int y){ if(s==x&&e==y)return tree[node]; int m=(s+e)/2; if(x>m)return query(node<<1|1,m+1,e,x,y); else if(y<=m)return query(node<<1,s,m,x,y); else return max(query(node<<1,s,m,x,m),query(node<<1|1,m+1,e,m+1,y)); } } seg1,seg2; int get(int L, int R){ int dl=0,dr=0; for(int i=0;i<=L;i++)dl=max(dl,-X[i]+D[i]); for(int i=R;i<n;i++)dr=max(dr,X[i]+D[i]); int ans=0; ans=max(ans,dl+dr+min(X[R]-X[L],C)+X[L]-X[R]); int m1=0; for(int i=L+1;i<=R;i++){ m1=max(m1,D[i] + min(X[i]-X[L], X[R]-X[i]+C)); } ans=max(ans,m1 + dl+X[L]); int m2=0; for(int i=L;i<R;i++){ m2=max(m2,D[i] + min(X[R]-X[i], X[i]-X[L]+C)); } ans=max(ans,m2+dr-X[R]); int bet=0; int idx=L; for(int i=L;i<=R;i++){ c1[i]=-X[i]+D[i]; c2[i]=X[i]+D[i]; seg1.update(1,0,n,i,c1[i]); seg2.update(1,0,n,i,c2[i]); } for(int i=L+1;i<=R;i++){ int lo = L-1, hi=i; while(lo<hi-1){ int mi=(lo+hi)/2; int c1= D[i] + D[mi] + X[i] - X[mi]; // walk int c2 = D[i] + D[mi] + C + X[mi] - X[L] + X[R] - X[i]; // teleport if(c2<=c1){ lo=mi; } else{ hi=mi; } } //[lo,i] teleport //[lo+1,i] walk if(L<=lo){ int wst=seg2.query(1,0,n,L,lo); bet=max(bet,D[i] - X[i] - X[L] + X[R] + wst); } if(lo+1<=i-1){ int wst=seg1.query(1,0,n,lo+1,i-1); bet=max(bet,D[i] + X[i] + wst); } } ans=max(ans,bet); for(int i=L;i<=R;i++){ for(int j=i+1;j<=R;j++){ bet=max(bet,D[i]+D[j]+min(X[j]-X[i],C+X[i]-X[L]+X[R]-X[j])); } } ans=max(ans,bet); vector<pi> vm1,vm2; for(int i=0;i<=L;i++){ vm1.push_back({X[i]+D[i],i}); vm2.push_back({-X[i]+D[i],i}); } sort(vm1.begin(),vm1.end(),greater<pi>()); sort(vm2.begin(),vm2.end(),greater<pi>()); for(int i=0;i<=min(1ll,(int)vm1.size()-1);i++){ for(int j=0;j<=min(1ll,(int)vm2.size()-1);j++){ if(vm1[i].second != vm2[j].second){ ans=max(ans,vm1[i].first+vm2[j].first); } } } vm1.clear(); vm2.clear(); for(int i=R;i<n;i++){ vm1.push_back({X[i]+D[i],i}); vm2.push_back({-X[i]+D[i],i}); } sort(vm1.begin(),vm1.end(),greater<pi>()); sort(vm2.begin(),vm2.end(),greater<pi>()); for(int i=0;i<=min(1ll,(int)vm1.size()-1);i++){ for(int j=0;j<=min(1ll,(int)vm2.size()-1);j++){ if(vm1[i].second != vm2[j].second){ ans=max(ans,vm1[i].first+vm2[j].first); } } } return ans; } long long find_shortcut(int32_t n, vector<int32_t> l, vector<int32_t> d, int32_t c) { L=l;D=d;C=c; ::n=n; for(int i=1;i<n;i++){ X[i]=X[i-1]+l[i-1]; } int ans=oo; for(int i=0;i<n;i++){ vector<int> vec; for(int j=i+1;j<n;j++){ int res=get(i,j); vec.push_back(res); ans=min(ans,res); } } return ans; } #ifdef LOCAL int32_t main() { int32_t n, c; assert(2 == scanf("%d%d", &n, &c)); std::vector<int32_t> l(n - 1); std::vector<int32_t> d(n); for (int i = 0; i < n - 1; i++) assert(1 == scanf("%d", &l[i])); for (int i = 0; i < n; i++) assert(1 == scanf("%d", &d[i])); long long t = find_shortcut(n, l, d, c); printf("%lld\n", t); return 0; } #endif

Compilation message (stderr)

shortcut.cpp: In function 'long long int get(long long int, long long int)':
shortcut.cpp:53:6: warning: unused variable 'idx' [-Wunused-variable]
   53 |  int idx=L;
      |      ^~~
#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...