제출 #254559

#제출 시각아이디문제언어결과실행 시간메모리
254559IloveNShortcut (IOI16_shortcut)C++14
0 / 100
3 ms488 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 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]; ll cal(int l,int r) { ll res=max(ps[l],ss[r]); 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(); } 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; return res; } 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]); } } int lef(int x,int d, ll val,int l,int r) { int ans=d; while (l<=r) { int mid=(l+r)/2; if (cal(x,mid)==val) ans=mid,r=mid-1; else l=mid+1; } return ans; } int rig(int x,int d, ll val,int l,int r) { int ans=d; while (l<=r) { int mid=(l+r)/2; if (cal(x,mid)==val) ans=mid,l=mid+1; else r=mid-1; } return ans; } ll best_r(int x) { int l=x+1,r=n; ll ans=inf; while (l<=r) { int mid=(l+r)/2; ll v=cal(x,mid); ans=min(ans,v); int l2=lef(x,mid,v,l,mid-1),r2=rig(x,mid,v,mid+1,r); if (l2>l) { ll vl=cal(x,l2-1); if (vl<v) { ans=min(ans,vl); r=l2-2; continue; } } if (r2<r) { ll vr=cal(x,r2+1); if (vr<v) { ans=min(ans,vr); l=vr+2; continue; } } 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); }*/ /*for (int l=1;l<n;l++) for (int r=l+1;r<=n;r++) ans=min(ans,cal(l,r));*/ /*int r=2,l=2; for (int i=1;i<n;i++) { l=max(l,i+1); r=max(r,l); ll res=cal(l,r); if (r==n) { ans=min(ans,res); continue; } ll new_res=cal(l,r+1); while (new_res<=res) { res=new_res; r++; if (r==n) break; new_res=cal(l,r+1); } ans=min(ans,res); }*/ for (int i=1;i<n;i++) ans=min(ans,best_r(i)); 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("ss.inp","r",stdin); 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...