Submission #74189

#TimeUsernameProblemLanguageResultExecution timeMemory
74189MKopchevShortcut (IOI16_shortcut)C++14
38 / 100
2045 ms1000 KiB
#include<bits/stdc++.h> using namespace std; const int nmax=1e6+42; long long x[nmax]; long long find_shortcut(int n, vector<int> l, vector<int> d, int c) { long long ans=1e18; x[0]=0; for(int i=1;i<n;i++) x[i]=x[i-1]+l[i-1]; for(int p=0;p<n;p++) for(int q=p+1;q<n;q++) { long long now=0; //1<->1 type long long best=-1e18; for(int j=0;j<p;j++) { now=max(now,d[j]+x[j]+best); best=max(best,d[j]-x[j]); } //cout<<now<<endl; //3<->3 type best=-1e18; for(int j=q+1;j<n;j++) { now=max(now,d[j]+x[j]+best); best=max(best,d[j]-x[j]); } //cout<<now<<endl; //1<->3 type best=-1e18; for(int i=0;i<p;i++) best=max(best,d[i]+x[p]-x[i]); for(int j=q+1;j<n;j++) now=max(now,d[j]+x[j]-x[q]+best+min(1LL*c,x[q]-x[p])); //1<->2 type best=-1e18; for(int i=0;i<p;i++) best=max(best,d[i]-x[i]+x[p]); for(int j=p;j<=q;j++) now=max(now,best+d[j]+min(x[j]-x[p],x[q]-x[j]+c)); //cout<<best<<" "<<now<<endl; //2<->3 type best=-1e18; for(int i=p;i<=q;i++) best=max(best,d[i]+min(x[i]-x[p]+c,x[q]-x[i])); for(int j=q+1;j<n;j++) now=max(now,best+d[j]+x[j]-x[q]); //cout<<best<<" "<<now<<endl; //2<->2 type /* if(x[q]-x[p]+c<0) for(int i=p;i<=q;i++) for(int j=i+1;j<=q;j++) now=max(now,d[i]+d[j]+x[q]-x[j]+c+x[i]-x[p]); else for(int i=p;i<=q;i++) for(int j=i+1;j<=q;j++) now=max(now,d[i]+d[j]+x[j]-x[i]); */ /* for(int i=p;i<=q;i++) for(int j=i+1;j<=q;j++) now=max(now,d[i]+d[j]+min(x[j]-x[i],x[q]-x[j]+c+x[i]-x[p])); */ //first is min deque< pair<long long/*difference*/,int/*where*/> > active={}; long long C1=x[q]-x[p]+c; for(int j=p;j<=q;j++) { while(active.size()&&2*(x[j]-x[active.front().second])>C1)active.pop_front(); if(active.size()) { now=max(now,d[j]+x[j]+active.front().first); } pair<long long/*difference*/,int/*where*/> add={d[j]-x[j],j}; while(active.size()&&active[active.size()-1].first<=add.first)active.pop_back(); active.push_back(add); } //second is min long long add=-1e18; int pos=p; for(int j=p;j<=q;j++) { while(2*(x[j]-x[pos])>C1) { add=max(add,d[pos]+x[pos]-x[p]); pos++; } now=max(now,d[j]+x[q]-x[j]+c+add); } ans=min(ans,now); } return ans; } /* int main() { cout<<find_shortcut(9, {10, 10, 10, 10, 10, 10, 10, 10},{20, 0, 30, 0, 0, 40, 0, 40, 0}, 30)<<endl; //cout<<find_shortcut(4, {2, 2, 2},{1, 10, 10, 1}, 1)<<endl; //cout<<find_shortcut(3, {1, 1},{1, 1, 1}, 3)<<endl; //cout<<find_shortcut(2,{100},{1,2},10)<<endl; return 0; } */
#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...