Submission #1348477

#TimeUsernameProblemLanguageResultExecution timeMemory
1348477warrennSplit the sequence (APIO14_sequence)C++20
100 / 100
472 ms81688 KiB
#include<bits/stdc++.h>
using namespace std;
#define ii pair<int,int>
#define fir first
#define sec second
#define pb push_back
#pragma GCC optimize("O3,unroll-loops")
const int maxn=1e5;

int n,k,a[maxn+2];
long long pref[maxn+2];
long long dp[2][maxn+2];
int opt[202][maxn+2];

void dnc(int lvl,int l,int r,int optl,int optr){
    if(l>r)return;
    int mid=(l+r)/2;
    int cur=lvl%2,prv=1-cur;

    dp[cur][mid]=-1e18;
    int op=-1,hmm=pref[n]-pref[mid];
    long long mx=-1e18;

    for(int q=optl;q<=min(optr,mid-1);q++){
        long long tot=dp[prv][q]+1LL*(pref[mid]-pref[q])*hmm;
        if(mx<tot){
            mx=tot;
            op=q;
        }
    }

    opt[lvl][mid]=op; dp[cur][mid]=mx;
    dnc(lvl,l,mid-1,optl,op);
    dnc(lvl,mid+1,r,op,optr);
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>k; k++;
    
    for(int q=1;q<=n;q++){
        cin>>a[q];
        pref[q]=pref[q-1]+a[q];
        dp[0][q]=-1e18;
    }
    
    dp[0][0]=0;
    for(int q=1;q<=k;q++){
        dnc(q,q,n,q-1,n);
    }
    //cout<<dp[7][2]<<endl;
    cout<<dp[k%2][n]<<'\n';

    for(int q=k;q>1;q--){
        cout<<opt[q][n]<<' ';
        n=opt[q][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...