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