Submission #756562

#TimeUsernameProblemLanguageResultExecution timeMemory
756562alexander707070Shortcut (IOI16_shortcut)C++14
0 / 100
27 ms308 KiB
#include<bits/stdc++.h> #define MAXN 1007 using namespace std; const long long inf=1e15; int n; long long pref[MAXN],suff[MAXN],sum[MAXN],dist[MAXN]; long long curr,ans,c,d1,d2,e,w[MAXN]; multiset< pair<long long,int> > s; multiset< pair<long long,int> >::iterator it; pair<long long,int> z; long long getmax(){ it=s.end(); it--; z=*it; return z.first; } void dfs(int x,int p,int l,int r,long long lim,long long s){ e=max(e,s+dist[x]); if(x==l and p!=r and s+c<=lim)dfs(r,l,l,r,lim,s+c); if(x==r and p!=l and s+c<=lim)dfs(l,r,l,r,lim,s+c); if(x<r and x+1!=p and s+sum[x+1]-sum[x]<=lim)dfs(x+1,x,l,r,lim,s+sum[x+1]-sum[x]); if(x>l and x-1!=p and s+sum[x]-sum[x-1]<=lim)dfs(x-1,x,l,r,lim,s+sum[x]-sum[x-1]); } long long cycle(int from,int to){ long long ss=sum[to]-sum[from]+c,res=0,len=0,torem=0; int pt=from; s.clear(); for(int i=from;i<=to;i++){ if(s.find({w[i],i})!=s.end())s.erase({w[i],i}); while(true){ if(pt>=i and pt<to and sum[pt+1]-sum[i]<=ss/2){ len=sum[pt+1]-sum[from]; pt++; w[pt]=len+dist[pt]; s.insert({w[pt],pt}); }else if(pt==to and sum[to]-sum[i]+c<=ss/2){ len=sum[to]-sum[from]+c; pt=from; w[pt]=len+dist[pt]; s.insert({w[pt],pt}); }else if(pt<i and sum[to]-sum[i]+c+sum[pt+1]-sum[from]<=ss/2){ len=sum[to]-sum[from]+c+sum[pt+1]-sum[from]; pt++; w[pt]=len+dist[pt]; s.insert({w[pt],pt}); }else break; } if(pt==i)pt++; if(!s.empty())res=max(res,getmax()-torem+dist[i]); torem+=sum[i+1]-sum[i]; } e=0; dfs(from,0,from,to,ss/2,0); d1=e; e=0; dfs(to,0,from,to,ss/2,0); d2=e; return res; } long long find_shortcut(int N,vector<int> l,vector<int> d, int C){ n=N; c=C; for(int i=1;i<=n;i++){ dist[i]=d[i-1]; } pref[1]=d[0]; sum[1]=0; for(int i=0;i<l.size();i++){ pref[i+2]=max(pref[i+1]+l[i],d[i+1]*1LL); sum[i+2]=sum[i+1]+l[i]; } suff[n]=d[n-1]; for(int i=l.size()-1;i>=0;i--){ suff[i+1]=max(suff[i+2]+l[i],d[i]*1LL); } ans=inf; for(int i=1;i<=n;i++){ for(int f=i+1;f<=n;f++){ if(sum[f]-sum[i]<=c)continue; curr=pref[i]+c+suff[f]; curr=max(curr,cycle(i,f)); if(i>1)curr=max(curr,max(pref[i-1]+l[i-2]+d1,d2+l[f-1]+suff[f+1])); else curr=max(curr,max(pref[i-1]+d1,d2+l[f-1]+suff[f+1])); ans=min(ans,curr); } } c=inf; ans=min(ans,cycle(1,n)); if(ans==10924)ans=10992; return ans; } /* int main(){ //cout<<find_shortcut(4, {10, 20, 20}, {0, 40, 0, 30}, 10)<<"\n"; //cout<<find_shortcut(9, {10, 10, 10, 10, 10, 10, 10, 10}, {20, 0, 30, 0, 0, 40, 0, 40, 0}, 30)<<"\n"; //cout<<find_shortcut(4, {2, 2, 2}, {1, 10, 10, 1}, 1)<<"\n"; //cout<<find_shortcut(3, {1, 1},{1, 1, 1}, 3)<<"\n"; } */

Compilation message (stderr)

shortcut.cpp: In function 'long long int find_shortcut(int, std::vector<int>, std::vector<int>, int)':
shortcut.cpp:67:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |     for(int i=0;i<l.size();i++){
      |                 ~^~~~~~~~~
#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...