Submission #1169894

#TimeUsernameProblemLanguageResultExecution timeMemory
1169894PieArmySplit the sequence (APIO14_sequence)C++20
0 / 100
0 ms584 KiB
#include<bits/stdc++.h> typedef long long ll; using namespace std; int n,k; int arr[100023]; ll pref[100023],suf[100023]; deque<pair<int,ll>>q[200]; ll dp[200]; int opt[100023][200]; int main(){ ios_base::sync_with_stdio(false);cin.tie(NULL); cin>>n>>k; for(int i=1;i<=n;i++){ cin>>arr[i]; pref[i]=arr[i]+pref[i-1]; } for(int i=n;i>=1;i--){ suf[i]=suf[i+1]+arr[i]; } q[k-1].push_back({0,0}); ll ans=-1; for(int i=1;i<n;i++){ for(int j=0;j<k;j++){ opt[i][j]=opt[i-1][j]; while(q[j].size()>1){ if(q[j][0].second-suf[i+1]*pref[q[j][0].first]<=q[j][1].second-suf[i+1]*pref[q[j][1].first])q[j].pop_front(); else break; } if(q[j].size()){ if(dp[j]<q[j][0].second+suf[i+1]*(pref[i]-pref[q[j][0].first])){ opt[i][j]=q[j][0].first; dp[j]=q[j][0].second+suf[i+1]*(pref[i]-pref[q[j][0].first]); } } //cout<<opt[i][j]<<":"<<dp[j]<<" "; if(j==0){ if(dp[j]>ans){ ans=dp[j]; opt[n][0]=i; } continue; } pair<int,ll>p={i,dp[j]}; while(q[j-1].size()>1){ pair<int,ll>a=q[j-1].front();q[j-1].pop_front(); if(__int128_t(q[j-1].back().second-p.second)*__int128_t(pref[a.first]-pref[q[j-1].back().first])<__int128_t(q[j-1].back().second-a.second)*__int128_t(pref[p.first]-pref[q[j-1].back().first]))continue; q[j-1].push_back(a); break; } bool ch=true; while(q[j-1].size()){ if(pref[q[j-1].back().first]==pref[p.first]){ if(q[j-1].back().second<=p.second)q[j-1].pop_back(); else{ ch=false; break; } } else break; } if(ch)q[j-1].push_back(p); } /*cout<<endl; if(i==n){ for(int j=0;j<k;j++){ for(auto x:q[j])cout<<x.first<<" "; cout<<endl; } }*/ } vector<int>v; int pos=opt[n][0]; cout<<ans<<endl; for(int i=0;i<k;i++){ v.push_back(pos); pos=opt[pos][i]; } while(v.size()){ cout<<v.back()<<" "; v.pop_back(); } }
#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...