This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |