Submission #20755

#TimeUsernameProblemLanguageResultExecution timeMemory
20755aintaShortcut (IOI16_shortcut)C++14
71 / 100
1233 ms107288 KiB
#include "shortcut.h"
#include<stdio.h>
#include<algorithm>
#include<vector>
#define N_ 1010000
#define SZ 1048576
#define pll pair<long long, long long>
using namespace std;
int n;
long long LD[N_], RD[N_], S[N_], P[N_], IT1[SZ+SZ], IT2[SZ+SZ], TL;
long long LT[N_], RT[N_];
int RR[N_], LL[N_];
long long Max1(int b, int e){
    long long r = -1e18;
    b+=SZ;e+=SZ;
    while(b<=e){
        r=max(r,max(IT1[b],IT1[e]));
        b=(b+1)>>1,e=(e-1)>>1;
    }
    return r;
}
long long Max2(int b, int e){
    long long r = -1e18;
    b+=SZ,e+=SZ;
    while(b<=e){
        r=max(r,max(IT2[b],IT2[e]));
        b=(b+1)>>1,e=(e-1)>>1;
    }
    return r;
}
long long st[1010000][2];
bool Pos(long long d){
    if(LD[n]<=d)return true;
    int i, pv = n, ppv = 1;
    long long Mx = 0;
    for(i=1;i<=n;i++){
        if(LD[i] > d){RR[i]=-1;continue;}
        if(i!=1){
            while(1){
                long long Len = S[pv]-S[i]+TL, mm;
                if(ppv < i)ppv = i;
                if(ppv > pv)ppv = pv;
                while((S[ppv+1]-S[i])*2 <= Len && ppv+1<=pv) ppv++;
                while((S[ppv]-S[i])*2 > Len)ppv--;
                mm = Max1(i,ppv) + Mx;
                if(ppv<pv) mm = max(mm,Max2(ppv+1,pv) + Mx + S[pv]+S[i]+TL);
                if(mm > d) pv--;
                else break;
            }
        }
        RR[i] = pv;
        Mx = max(Mx, P[i]-S[i]);
    }
    Mx = 0, pv = 1, ppv = n;
    for(i=n;i>=1;i--){
        if(RD[i] > d){LL[i]=-1;continue;}
        if(i!=n){
            while(1){
                long long Len = S[i]-S[pv]+TL, mm;
                if(ppv > i)ppv = i;
                if(ppv < pv)ppv = pv;
                while((S[i]-S[ppv-1])*2 <= Len && ppv-1>=pv) ppv--;
                while((S[i]-S[ppv])*2 > Len)ppv++;
                mm = Max2(ppv,i) + Mx;
                if(ppv>pv) mm = max(mm,Max1(pv,ppv-1) + Mx - S[pv]-S[i]+TL);
                if(mm > d) pv++;
                else break;
            }
        }
        LL[i] = pv;
        Mx = max(Mx, P[i]+S[i]);
    }
    long long ML = 1e18;
    int top = 0;
    for(i=1;i<=n;i++){
        if(top && st[1][0] + P[i] + S[i] > d){
            int bb = 1, ee = top, rr=0, mid;
            while(bb<=ee){
                mid=(bb+ee)>>1;
                if(st[mid][0]+P[i]+S[i]>d){
                    rr = mid;
                    bb = mid + 1;
                }
                else ee = mid-1;
            }
            ML = min(ML, d - (st[rr][1] + P[i] - S[i]));
        }
        while(top && P[i]-S[i] >= st[top][0])top--;
        top++;
        st[top][0]=P[i]-S[i];
        st[top][1]=P[i]+S[i];
    }
    pv = 1;
    for(i=1;i<n;i++){
        pv=max(pv,i);
        while(pv+1<=n && S[pv+1]-S[i]+TL <=ML)pv++;
        int t = min(pv, RR[i]);
        if(t <= i || LL[t]==-1)continue;
        if(LL[t] > i)continue;
        if(LT[i] + RT[t] - (S[t]-S[i]) + TL <= d)return true;
    }
    return false;
}
long long find_shortcut(int N, vector<int> l, vector<int> d, int c)
{
    TL = c;
    n = N;
    int i;
    for(i=1;i<=n;i++){
        if(i!=1)S[i] = S[i-1] + l[i-2];
        P[i] = d[i-1];
    }
    long long mx = 0;
    for(i=1;i<=n;i++){
        LD[i] = max(LD[i-1], mx+S[i]+P[i]);
        mx = max(mx, P[i]-S[i]);
        LT[i] = mx;
    }
    mx = S[n];
    for(i=n;i>=1;i--){
        RD[i] = max(RD[i+1], mx-S[i]+P[i]);
        mx = max(mx, P[i]+S[i]);
        RT[i] = mx;
        int t = i+SZ;
        IT1[t] = S[i]+P[i], IT2[t] = P[i]-S[i];
        while(t!=1){
            t>>=1;
            IT1[t] = max(IT1[t+t],IT1[t+t+1]);
            IT2[t] = max(IT2[t+t],IT2[t+t+1]);
        }
    }
    long long b = 0, e = LD[n], mid, res = 0;
    while(b<=e){
        mid = (b+e)/2;
        if(Pos(mid)){
            res = mid;
            e = mid - 1;
        }
        else b = 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...