제출 #254531

#제출 시각아이디문제언어결과실행 시간메모리
254531IloveNShortcut (IOI16_shortcut)C++14
38 / 100
2082 ms640 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]); } } ll best_r(int x) { int l=x+1,r=n; ll ans=inf; while (l<=r) { int mid1=(l*2+r)/3,mid2=(l+r*2)/3; ll val1=cal(x,mid1),val2=cal(x,mid2); if (val1<val2) r=val2-1,ans=min(ans,val1); else l=val1+1,ans=min(ans,val2); } return ans; } ll best() { /*int l=1,r=n; ll ans=inf; 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); }*/ ll ans=inf; for (int l=1;l<n;l++) for (int r=l+1;r<=n;r++) ans=min(ans,cal(l,r)); 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...