Submission #424305

#TimeUsernameProblemLanguageResultExecution timeMemory
424305AntekbShortcut (IOI16_shortcut)C++14
23 / 100
24 ms332 KiB
#include "shortcut.h" #include<bits/stdc++.h> #define st first #define nd second using namespace std; const int N=3005; typedef long long ll; const ll INF=1e18; struct kol{ deque<pair<ll, int> > Q; int ile=0; void push(ll a){ ile++; int sum=1; while(Q.size() && Q.back().st<=a){ sum+=Q.back().nd; Q.pop_back(); } Q.push_back({a, sum}); } void pop(){ ile--; if(!--Q.front().nd)Q.pop_front(); } ll maks(){ if(!Q.size())return -INF; return Q.front().st; } }; ll lew[N], pra[N], tab[N], dist[N], dist2[N], lew2[N], pra2[N]; int C; ll calc(int a, int b){ dist[a]=lew[a]; dist[b]=pra[b]; ll ans=max(pra2[b], lew2[a]); int j=a+1; kol q, q2; q.push(tab[a]+dist[a]); for(int i=a+1; i<=b; i++)q2.push(dist[i]-tab[i]); //cout<<a<<"."<<b<<"\n\n"; for(int i=a; i<=b; i++){ while(j<=b && tab[j]-tab[i]<=tab[b]-tab[j]+C+tab[i]-tab[a]){ //cout<<"+ "<<tab[j]+dist[j]<<"\n"; q.push(tab[j]+dist[j]); q2.pop(); j++; } q.pop(); //cout<<i<<" "<<j<<"\n"; //cout<<q.ile<<" "<<q.maks()<<" "<<q2.ile<<" "<<q2.maks()<<"\n"; ans=max(ans, dist[i]+q.maks()-tab[i]); ans=max(ans, dist[i]+q2.maks()+C+tab[i]-tab[a]+tab[b]); //cout<<dist[i]+q.maks()-tab[i]<<" "<<dist[i]+q2.maks()+C+tab[i]-tab[a]+tab[b]<<"\n"; /*for(int j=i+1; j<=b; j++){ //cout<<i<<j<<" "<<dist[i]<<" "<<dist[j]<<" "<<tab[j]-tab[i]<<" "<<tab[b]-tab[j]+C+tab[i]-tab[a]<<"\n"; ans=max(ans, dist[i]+dist[j]+min(tab[j]-tab[i], tab[b]-tab[j]+C+tab[i]-tab[a])); }*/ } dist[a]=dist2[a]; dist[b]=dist2[b]; //cout<<a<<" "<<b<<" "<<ans<<"\n\n"; return ans; } long long find_shortcut(int n, std::vector<int> l, std::vector<int> d, int c) { C=c; for(int i=1; i<n; i++){ tab[i]=tab[i-1]+l[i-1]; } for(int i=0; i<n; i++){ dist[i]=dist2[i]=d[i]; lew[i]=d[i]; if(i){ lew[i]=max(lew[i], lew[i-1]+l[i-1]); lew2[i]=max(lew2[i-1], lew[i-1]+d[i]+l[i-1]); } } for(int i=n-1; i>=0; i--){ pra[i]=d[i]; if(i+1<n){ pra[i]=max(pra[i], pra[i+1]+l[i]); pra2[i]=max(pra2[i+1], pra[i+1]+d[i]+l[i]); } } ll ans=INF; /*for(int i=0; i<n-1; i++){ for(int j=0; j<=i; j++)cout<<"0000"<<" "; for(int j=i+1; j<n; ++j){ cout<<calc(i, j)<<" "; ans=min(ans, calc(i, j)); } cout<<"\n"; }*/ for(int i=0; i<n-1 && i<50; i++){ //for(int j=0; j<=i; j++)cout<<"0000"<<" "; for(int j=max(i+1, n-50); j<n; ++j){ //cout<<calc(i, j)<<" "; ans=min(ans, calc(i, j)); } //cout<<"\n"; } /*int L=0, R=n-1; while(L<R-1){ ll k=calc(L, R); ans=min(ans, k); ll t=calc(L, R-1); if(t<k){ ans=min(ans, t); R--; continue; } t=calc(L+1, R); if(t<k){ ans=min(ans, t); R--; continue; } L++; R--; } if(L!=R)ans=min(ans, calc(L, R));*/ //ans=calc(1, 3); 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...