Submission #329246

#TimeUsernameProblemLanguageResultExecution timeMemory
329246jovan_bSplit the sequence (APIO14_sequence)C++17
62 / 100
583 ms81244 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

ll pre[100005];
ll dp[100005];
ll dpp[100005];
int prosli[205][100005];

struct line{
    ll a, b;
    int ind;
    ll eval(ll x){
        return a*x+b;
    }
};

int main(){
    ios_base::sync_with_stdio(false), cin.tie(0);

    int n, k;
    cin >> n >> k;
    for(int i=1; i<=n; i++){
        int x;
        cin >> x;
        pre[i] = pre[i-1] + x;
    }
    for(int j=1; j<=k; j++){
        deque <line> lines;
        line nline;
        nline.a = pre[j];
        nline.b = -pre[j]*pre[j] + dpp[j];
        nline.ind = j;
        lines.push_back(nline);
        for(int i=j+1; i<=n; i++){
            while(lines.size() >= 2){
                line line1 = lines.front();
                lines.pop_front();
                line line2 = lines.front();
                if(line2.eval(pre[i]) < line1.eval(pre[i])){
                    lines.push_front(line1);
                    break;
                }
            }
            dp[i] = lines.front().eval(pre[i]);
            prosli[j][i] = lines.front().ind;
            nline.a = pre[i];
            nline.b = -pre[i]*pre[i] + dpp[i];
            nline.ind = i;
            if(pre[i]-pre[i-1] || nline.b > lines.back().b) lines.push_back(nline);
        }
        for(int i=1; i<=n; i++){
            dpp[i] = dp[i];
        }
    }
    cout << dp[n] << "\n";
    int t = n;
    for(int i=k; i>=1; i--){
        cout << prosli[i][t] << " ";
        t = prosli[i][t];
    }
    return 0;
}

/*
7 3
4 1 3 4 0 2 3
*/
#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...