Submission #1011284

#TimeUsernameProblemLanguageResultExecution timeMemory
1011284bachhoangxuanShortcut (IOI16_shortcut)C++17
100 / 100
1276 ms57308 KiB
#include "shortcut.h"
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll inf = 1e18;

ll find_shortcut(int n, std::vector<int> _x, std::vector<int> _d, int c)
{
    vector<ll> x(n),d(n);
    for(int i=0;i<n;i++) x[i]=(i?x[i-1]+_x[i-1]:0),d[i]=_d[i];
    auto check = [&](ll S){
        deque<int> dq;
        ll a0=-inf,a1=inf,b0=-inf,b1=inf,m0=-inf,m1=-inf,cS=S-c;
        for(int i=0;i<n;i++){
            if(m0+d[i]+x[i]>S){
                while(!dq.empty() && d[dq.front()]-x[dq.front()]+d[i]+x[i]>S){
                    int t=dq.front();dq.pop_front();
                    m1=max(m1,d[t]+x[t]);
                }
                a0=max(a0,d[i]+x[i]+m1-cS);
                a1=min(a1,cS-d[i]+x[i]-m0);
                b0=max(b0,d[i]-x[i]+m1-cS);
                b1=min(b1,cS-d[i]-x[i]-m0);
            }
            m0=max(m0,d[i]-x[i]);
            while(!dq.empty() && d[dq.back()]-x[dq.back()]<=d[i]-x[i]) dq.pop_back();
            dq.push_back(i);
        }
        //cout << a0 << ' ' << a1 << ' ' << b0 << ' ' << b1 << '\n';
        int la=0,lb=n,ra=-1,rb=n-1;
        for(int i=n-1;i>=0;i--){
            while(la<n && x[i]+x[la]<a0) la++;
            while(ra<n-1 && x[i]+x[ra+1]<=a1) ra++;
            while(lb>0 && x[i]-x[lb-1]<=b1) lb--;
            while(rb>=0 && x[i]-x[rb]<b0) rb--;
            int L=max({la,lb,i}),R=min(ra,rb);
            //cout << la << ' ' << lb << ' ' << ra << ' ' << rb << '\n';
            if(L<=R) return true;
        }
        return false;
    };
    ll l=0,r=1e16,res=r;
    while(l<=r){
        ll mid=(l+r)>>1;
        if(check(mid)) res=mid,r=mid-1;
        else l=mid+1;
    }
    return res;
}
#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...