Submission #1026423

#TimeUsernameProblemLanguageResultExecution timeMemory
1026423vjudge1Shortcut (IOI16_shortcut)C++17
71 / 100
635 ms148808 KiB
#include "shortcut.h"
#include<bits/stdc++.h>

using namespace std;
long long ans=1e18,lofn;
vector<long long>prf,dep,len;
long long precalc[3010][3010];
int checklr(int lend,int rend){
    vector<long long>dep2=dep,origd;
    long long vl=0,mxpos=0;
    for(int i=2;i<=lend;i++){
        vl=max(vl,dep2[i]+len[i-1]+dep2[i-1]);
        dep2[i]=max(dep2[i],dep2[i-1]+len[i-1]);
    }
    for(int i=dep.size();--i>rend;){
        long long gameover=dep2[i]+len[i-1]+dep2[i-1];
        if(vl<gameover)vl=gameover,mxpos=rend;
        dep2[i-1]=max(dep2[i-1],dep2[i]+len[i-1]);
    }
    origd=dep2;
    for(int i=lend+1;i<=rend;i++)
        dep2[i]=max(dep2[i-1],prf[i]-prf[lend]+origd[i]);
    dep2[lend-1]=-1e18;
    long long KY=prf[rend]-prf[lend]+lofn;
    int pt=rend;
    for(int i=rend;i>lend;i--){
        while(pt>lend&&prf[i]-prf[pt-1]<=KY/2)
            pt--;
        long long tis=dep2[pt-1]+lofn+origd[i]-prf[i]+prf[rend];
        long long tis2=origd[i]+prf[i]+max(pt==lend?origd[lend]-prf[lend]:dep2[lend-1],precalc[pt][i-1]);
        long long tis3=max(tis,tis2);
        if(tis3>vl) mxpos=i,vl=tis3;
    }
    ans=min(ans,vl);
    return mxpos==rend;
}  
void binsearch(int l){
    int L=l+1,R=dep.size()-1;
    while(L<=R){
        int mid=L+R>>1;
        if(checklr(l,mid))
            L=mid+1;
        else R=mid-1;
    }
}
long long find_shortcut(int n, vector<int> l, vector<int> d, int c) {
    lofn=c;
    dep=len={0};
    prf={0,0};
    for(auto i:l)
        len.push_back(i),
        prf.push_back(i);
    for(auto i:d)
        dep.push_back(i);
    memset(precalc,-7,sizeof precalc);
    for(int i=1;i<=n;i++)
        prf[i]+=prf[i-1],precalc[i][i]=dep[i]-prf[i];
    for(int i=n-1;i;i--) for(int j=i+1;j<=n;j++)
        precalc[i][j]=max(precalc[i][j-1],dep[j]-prf[j]);
    for(int i=1;i<n;i++)
        binsearch(i);
    return ans;
}

Compilation message (stderr)

shortcut.cpp: In function 'void binsearch(int)':
shortcut.cpp:40:18: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   40 |         int mid=L+R>>1;
      |                 ~^~
#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...