Submission #254724

#TimeUsernameProblemLanguageResultExecution timeMemory
254724IloveNShortcut (IOI16_shortcut)C++14
38 / 100
2087 ms760 KiB
#include<bits/stdc++.h> #include "shortcut.h" using namespace std; #define ll long long #define pb push_back #define eb emplace_back #define all(vr) vr.begin(),vr.end() #define pii pair<int,int> #define pll pair<ll,ll> #define pli pair<ll,int> #define fi first #define se second #define mp make_pair const int N=1e6+10; const ll inf=1e18; ll p[N],val[N],n,c,ps[N],ss[N],best_ps[N],best_ss[N]; pli cal(int l,int r) { ll res1=ss[r]; ll res=ps[l]; ll dis=p[r]-p[l]+c; ll tmp1=val[l],tmp2=val[r]; val[l]=best_ps[l]+p[l]; val[r]=best_ss[r]+(p[n]-p[r]); deque<int> q; q.push_front(l); ll best=-inf; for (int i=l+1;i<=r;i++) { while (!q.empty() && p[i]-p[q.back()]>dis/2) { best=max(best,p[q.back()]+val[q.back()]); q.pop_back(); } if (i==r) { res1=max(res1,dis-p[i]+best+val[i]); if (!q.empty()) res1=max(res1,p[i]+val[i]-p[q.back()]+val[q.back()]); break; } res=max(res,dis-p[i]+best+val[i]); if (!q.empty()) res=max(res,p[i]+val[i]-p[q.back()]+val[q.back()]); while (!q.empty() && -p[i]+val[i]>=-p[q.front()]+val[q.front()]) q.pop_front(); q.push_front(i); } val[l]=tmp1,val[r]=tmp2; //cout<<res<<" "<<res1<<"\n"; if (res>res1) return mp(res,1); if (res<res1) return mp(res1,-1); return mp(res,0); } void build() { for (int i=1;i<=n;i++) { ps[i]=max(ps[i-1],p[i]+val[i]+best_ps[i-1]); best_ps[i]=max(best_ps[i-1],-p[i]+val[i]); } for (int i=n;i;i--) { ss[i]=max(ss[i+1],p[n]-p[i]+val[i]+best_ss[i+1]); best_ss[i]=max(best_ss[i+1],-(p[n]-p[i])+val[i]); } } ll best_r(int x) { int l=x+1,r=n; ll ans=inf; while (l<=r) { int mid=(l+r)/2; pli v=cal(x,mid); ans=min(ans,v.fi); if (v.se==1) r=mid-1; else if (v.se==-1) l=mid+1; else break; } return ans; } ll best() { ll ans=inf; /*int l=1,r=n; while (l<=r) { int mid1=(l*2+r)/3,mid2=(l+r*2)/3; ll val1=best_r(mid1),val2=best_r(mid2); if (val1<val2) r=val2-1,ans=min(ans,val1); else l=val1+1,ans=min(ans,val2); }*/ //int t; /*for (int l=1;l<n;l++) { ll res=inf; for (int r=l+1;r<=n;r++) res=min(res,cal(l,r)); if (res<ans) ans=res,t=l; } cout<<t<<"\n";*/ //int l=3,r=47; /*for (int r=l+1;r<=n;r++) { ll v=cal(l,r); if (v<ans) ans=v,t=r; } cout<<t<<"\n";*/ //for (int i=l+1;i<=n;i++) cout<<cal(l,i)<<"\n"; for (int i=1;i<n;i++) ans=min(ans,best_r(i)); //ans=min(ans,best_r(3)); //ans=cal(3,47).fi; return ans; } ll find_shortcut(int x,vector<int> l,vector<int> d,int y) { n=x; c=y; val[1]=d[0]; for (int i=2;i<=n;i++) p[i]=p[i-1]+l[i-2],val[i]=d[i-1]; build(); return best(); } /*void read() { cin>>n>>c; for (int i=2,x;i<=n;i++) cin>>x,p[i]=p[i-1]+x; for (int i=1;i<=n;i++) cin>>val[i]; } int main() { freopen("93","r",stdin); freopen("ss.out","w",stdout); ios::sync_with_stdio(false); cin.tie(0); read(); build(); cout<<best(); return 0; }*/
#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...