Submission #142952

#TimeUsernameProblemLanguageResultExecution timeMemory
142952Bodo171Shortcut (IOI16_shortcut)C++14
100 / 100
1280 ms57208 KiB
#include "shortcut.h"
#include <iostream>
using namespace std;
const int nmax=1000*1000+5;
const long long inf=1LL*1e18;
int d[nmax];
long long x[nmax],y[nmax];
int i,n;
long long C;
bool check(long long k)
{
    long long mxsum=-inf,mndif=inf;
    long long suml=-inf,sumr=inf,difl=-inf,difr=inf;
    long long sum,dif;
    int p=1,u=0;
    for(i=1;i<=n;i++)
    {
        while(p<=u&&x[i]-x[d[p]]+y[i]+y[d[p]]>k)
        {
            sum=x[d[p]]+y[d[p]];dif=x[d[p]]-y[d[p]];
            if(sum>mxsum) mxsum=sum;
            if(dif<mndif) mndif=dif;
            p++;
        }
        if(mxsum!=-inf)
        {
            suml=max(suml,-k+C+mxsum+x[i]+y[i]);
            sumr=min(sumr,k-C+mndif+x[i]-y[i]);
            difl=max(difl,-k+C-mndif+x[i]+y[i]);
            difr=min(difr,k-C-mxsum+x[i]-y[i]);
        }
        while(p<=u&&x[i]-y[i]<x[d[u]]-y[d[u]])
            u--;
        d[++u]=i;
    }
    if(suml>sumr||difl>difr) return 0;
    int p1=1,p2=n;
    int poz;
    for(i=1;i<=n;i++)
    {
        while(p1<=n&&x[p1]-x[i]<difl)
            p1++;
        while(p2>=1&&x[p2]+x[i]>=suml)
            p2--;
        poz=max(i+1,max(p1,p2+1));
        if(poz<=n&&x[poz]+x[i]>=suml&&x[poz]+x[i]<=sumr&&x[poz]-x[i]>=difl&&x[poz]-x[i]<=difr)
            return 1;
    }
    return 0;
}
long long find_shortcut(int N, std::vector<int> l, std::vector<int> d, int c)
{
    C=c;n=N;
    for(i=0;i<n-1;i++)
        x[i+2]=x[i+1]+l[i];
    for(i=0;i<n;i++)
        y[i+1]=d[i];
    long long ans=0;
    for(long long p=50;p>=0;p--)
        ans+=(1LL<<p);
    for(long long p=50;p>=0;p--)
        if(check(ans-(1LL<<p)))
           ans-=(1LL<<p);
    return ans;
}
#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...