Submission #99596

#TimeUsernameProblemLanguageResultExecution timeMemory
99596KLPPShortcut (IOI16_shortcut)C++14
71 / 100
2091 ms3624 KiB
#include "shortcut.h"
#include<bits/stdc++.h>

using namespace std;
typedef long long int lld;

long long find_shortcut(int n, std::vector<int> l, std::vector<int> d, int c)
{
    lld lo,hi;
    lo=-1;
    hi=1000000000000000;
    lld level[n];
    level[0]=0;
    for(int i=1;i<n;i++)level[i]=level[i-1]+l[i-1];
    lld max_coord_sum[n];
    max_coord_sum[n-1]=level[n-1]+d[n-1];
    lld max_coord_diff[n];
    max_coord_diff[0]=d[0]-level[0];
    for(int i=1;i<n;i++){
        max_coord_diff[i]=max(max_coord_diff[i-1],d[i]-level[i]);
    }
    for(int i=n-2;i>-1;i--){
        max_coord_sum[i]=max(max_coord_sum[i+1],level[i]+d[i]);
    }
    vector<pair<lld,lld> >V;
    for(int i=0;i<n;i++){
        V.push_back(pair<lld,lld>(level[i]-d[i],-level[i]-d[i]));
    }
    lld min_case[n];
    min_case[0]=V[0].second;
    sort(V.begin(),V.end());
    while(hi-lo>1){
        lld mid=(hi+lo)/2;
        lld min_sum,max_sum;
        lld min_diff,max_diff;
        min_sum=0;
        min_diff=0;
        max_sum=1000000000000000;
        max_diff=1000000000000000;

        for(int i=0;i<n-1;i++){
            if(max_coord_sum[i+1]+d[i]-level[i]>mid){
                min_sum=max(min_sum,level[i]+d[i]+max_coord_sum[i+1]+c-mid);
                min_diff=max(min_diff,-level[i]+d[i]-mid+c+max_coord_sum[i+1]);
            }
            for(int j=i+1;j<n;j++){
                lld D=level[j]-level[i];
                if(D+d[i]+d[j]>mid){
                    lld u=mid-d[i]-d[j]-c;
                    //min_sum=max(min_sum,level[i]+level[j]-u);
                    //min_diff=max(min_diff,level[j]-level[i]-u);
                    //max_sum=min(max_sum,level[i]+level[j]+u);
                    max_diff=min(max_diff,level[j]-level[i]+u);
                }
            }
        }
        for(int i=1;i<n;i++){
            if(level[i]+d[i]+max_coord_diff[i-1]>mid){
                max_sum=min(max_sum,level[i]-d[i]+mid-c-max_coord_diff[i-1]);

            }
        }
        bool b=false;
        for(int i=0;i<n;i++){
            lld MIN=max(min_sum-level[i],min_diff+level[i]);
            lld MAX=min(max_sum-level[i],max_diff+level[i]);
            int hi1,lo1;
            lo1=i;
            hi1=n;
            while(lo1+1<hi1){
                int m=(hi1+lo1)/2;
                if(level[m]>=MIN){
                    hi1=m;
                }else lo1=m;
            }
            int hi2,lo2;
            lo2=i;
            hi2=n;
            while(lo2+1<hi2){
                int m=(hi2+lo2)/2;
                if(level[m]<=MAX){
                    lo2=m;
                }else hi2=m;
            }
            if(lo2>=hi1)b=true;
        }
        if(b)hi=mid;
        else lo=mid;
    }
    return hi;
}

Compilation message (stderr)

shortcut.cpp: In function 'long long int find_shortcut(int, std::vector<int>, std::vector<int>, int)':
shortcut.cpp:29:9: warning: variable 'min_case' set but not used [-Wunused-but-set-variable]
     lld min_case[n];
         ^~~~~~~~
#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...