Submission #737862

#TimeUsernameProblemLanguageResultExecution timeMemory
737862amirhoseinfar1385Split the sequence (APIO14_sequence)C++17
100 / 100
1708 ms83972 KiB
#include<bits/stdc++.h> using namespace std; vector<long long>dp1,dp0; vector<vector<int>>dpa; vector<int>ps,suf; int n,k; int fj; void solve(int l,int r,int tl,int tr){ //cout<<l<<" "<<r<<" "<<tl<<" "<<tr<<" "<<fj<<endl; if(l>r||tl>tr){ return ; } if(tl==tr){ for(int i=l;i<=r;i++){ dpa[fj][i]=tl; } return ; } int mid=(l+r)>>1; int mina=tl; int maxa=min(tr,mid-1); for(int i=mina;i<=maxa;i++){ long long fake=dp0[i]+1ll*(ps[mid]-ps[i])*suf[mid+1]; if(fake>dp1[mid]){ dp1[mid]=fake; dpa[fj][mid]=i; } } solve(l,mid-1,tl,dpa[fj][mid]); solve(mid+1,r,dpa[fj][mid],tr); } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>k; vector<int>all(n+1); for(int i=1;i<=n;i++){ cin>>all[i]; } dp1.resize(n+3); dp0.resize(n+3); dpa.resize(k+5,vector<int>(n+3)); ps.resize(n+3); suf.resize(n+3); for(int i=1;i<=n;i++){ ps[i]=ps[i-1]+all[i]; } for(int i=n;i>=1;i--){ suf[i]=all[i]+suf[i+1]; } for(int i=1;i<=n;i++){ dp1[i]=1ll*ps[i]*suf[i+1]; dpa[1][i]=-1; } for(int j=2;j<=k;j++){ swap(dp0,dp1); for(int i=0;i<=n;i++){ dp1[i]=0; } fj=j; solve(j,n,1,n); for(int i=1;i<j;i++){ dp1[i]=dp0[i]; dpa[j][i]=dpa[j-1][i]; } for(int i=j;i<=n;i++){ dp1[i]=dp0[dpa[j][i]]+1ll*(ps[i]-ps[dpa[j][i]])*suf[i+1]; } } long long maxa=-1,w=0; for(int i=1;i<n;i++){ if(dp1[i]>maxa){ w=i; maxa=dp1[i]; } } cout<<maxa<<"\n"; int now=k; vector<int>res; vector<int>vis(n+3); while(now>0&&w>0){ //cout<<now<<" "<<w<<endl; res.push_back(w); vis[w]=1; w=dpa[now][w]; now--; } reverse(res.begin(),res.end()); for(int i=1;i<n;i++){ if(now>0&&vis[i]==0){ now--; res.push_back(i); } } for(auto x:res){ cout<<x<<" "; } cout<<endl; }
#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...