Submission #596302

#TimeUsernameProblemLanguageResultExecution timeMemory
596302kshitij_sodaniUplifting Excursion (BOI22_vault)C++14
0 / 100
1 ms468 KiB
#include <bits/stdc++.h> using namespace std; typedef long long llo; #define a first #define b second #define pb push_back #define endl '\n' llo n,dd; llo it[350]; llo dp[1000001]; deque<pair<llo,llo>> zz[301]; int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin>>n>>dd; llo cot=0; for(llo i=0;i<n;i++){ llo aa; cin>>aa; cot+=aa; } llo su=0; for(llo i=0;i<=n;i++){ cin>>it[i]; su+=it[i]*i; cot+=it[i]; } if(su<dd){ cout<<"impossible"<<endl; return 0; } llo cur=su-dd; it[0]=0; llo ans=-1; for(llo i=1;i<=n;i++){ llo su2=0; llo ac=0; for(llo j=i+1;j<=n;j++){ llo xx=it[j]-n; if(xx<0){ xx=0; } ac+=xx; su2+=xx*j; } if(su2>cur){ continue; } llo su3=n*n*n; /*for(llo j=1;j<i;j++){ su3+=j*min(n,it[j]); } for(llo j=i+1;j<n;j++){ su3+=j*min(it[j],n); }*/ for(llo j=0;j<=su3;j++){ dp[j]=-1; } dp[0]=0; for(llo j=1;j<i;j++){ for(int jj=0;jj<j;jj++){ zz[jj].clear(); } for(int ii=0;ii<=su3;ii++){ int y=ii%j; if(dp[ii]>=0){ pair<int,int> cur={dp[ii]-(ii/j),ii}; while(zz[y].size()){ if(zz[y].back().a>=cur.a){ zz[y].pop_back(); } else{ break; } } zz[y].pb(cur); } while(zz[y].size()){ if(zz[y].front().b<ii-j*min(it[i],n)){ zz[y].pop_front(); } else{ break; } } if(zz[y].size()){ llo xx=zz[y].front().a+(ii/j) ; if(dp[ii]==-1){ dp[ii]=xx; } dp[ii]=min(dp[ii],xx); } } /* for(llo ii=su3;ii>=0;ii--){ llo co=0; for(llo jj=ii;jj>=0 and jj>=ii-j*n;jj-=j){ if(dp[jj]>=0){ llo xx=dp[jj]+co; if(co>it[j]){ continue; } if(dp[ii]==-1){ dp[ii]=xx; } dp[ii]=min(dp[ii],xx); } co++; } }*/ } for(llo j=i+1;j<=n;j++){ for(llo ii=su3;ii>=0;ii--){ llo co=0; for(llo jj=ii;jj>=0 and jj>=ii-j*min(it[j],n);jj-=j){ if(dp[jj]>=0){ llo xx=dp[jj]+co; /* if(co>min(it[j],n)){ continue; }*/ if(dp[ii]==-1){ dp[ii]=xx; } dp[ii]=min(dp[ii],xx); } co++; } } } llo cur2=cur-su2; for(llo j=0;j<=su3;j++){ if(cur2>=j and dp[j]>=0){ if((cur2-j)%i==0){ llo x=(cur2-j)/i; if(x<=it[i]){ llo y=dp[j]+x; y+=ac; if(ans==-1){ ans=y; } /* if(y==11){ cout<<dp[j]<<endl; cout<<cur2<<",,,,"<<su2<<endl; cout<<i<<"::"<<j<<endl; }*/ ans=min(ans,y); } } } } } if(ans==-1){ cout<<"impossible"<<endl; } else{ //cout<<ans<<endl; cout<<cot-ans<<endl; } //else find minimum number of elements with sum su-dd 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...