Submission #670197

#TimeUsernameProblemLanguageResultExecution timeMemory
670197MahdiSplit the sequence (APIO14_sequence)C++17
100 / 100
1168 ms81544 KiB
#include<bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
#define all(v) v.begin(), v.end()
#define F first
#define S second
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, int> pli;
const int N=1e5+5;
int n, k, a[N], b[205][N], pd[N];
ll dp[N], dd[N];

void sol(int i, int l, int r, int lx, int rx){
    int m=(l+r)/2;
    pli x={dp[lx]+1LL*pd[lx]*(pd[m]-pd[lx]), lx};
    for(int j=lx+1;j<min(m, rx+1);++j)
        x=max(x, {dp[j]+1LL*pd[j]*(pd[m]-pd[j]), j});
    dd[m]=x.F;
    b[i][m]=x.S;
    if(l<m)
        sol(i, l, m, lx, x.S);
    if(m+1<r)
        sol(i, m+1, r, x.S, rx);
}

int main(){
    cin>>n>>k;
    for(int i=1;i<=n;++i){
        cin>>a[i];
        pd[i]=a[i]+pd[i-1];
    }
    for(int i=1;i<=k;++i){
        sol(i, 1, n+1, 0, n-1);
        for(int j=1;j<=n;++j)
            dp[j]=dd[j];
    }
    cout<<dp[n]<<'\n';
    vector<int>v;
    int h=n;
    for(int i=k;i>0;--i){
        h=b[i][h];
        v.push_back(h);
    }
    for(int i=k-1;i>=0;--i)
        cout<<v[i]<<' ';
    cout<<'\n';
}
#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...