#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]);
if(j==0&&dp[j]>=ans){
ans=dp[j];
opt[n][0]=i;
}
}
}
//cout<<opt[i][j]<<":"<<dp[j]<<" ";
if(j==0)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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |