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 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 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... |