#include <bits/stdc++.h>
#define maxn 100005
#define fi first
#define se second
using namespace std;
struct line {
    int a; int64_t b;
    line() {}
    line(int _a, int64_t _b) : a(_a), b(_b) {}
    long double intersectX(const line &other) const {
        return (long double) (b-other.b) / (other.a-a);
    }
};
int64_t f(line x, int y) {
    return 1LL * x.a * y + x.b;
}
int n, k;
int a[maxn], s[maxn];
int64_t dp[maxn][205];
int p[maxn][205];
int main() {
//    if (fopen("check.inp", "r")) {
//        freopen("check.inp", "r", stdin);
//        freopen("check.out", "w", stdout);
//    }
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> k;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        s[i] = s[i-1] + a[i];
    }
    ++k;
    for (int i = 0; i <= n; i++) for (int j = 0; j <= k; j++) dp[i][j] = LLONG_MIN;
    dp[0][0] = 0;
    for (int c = 1; c <= k; c++) {
        deque<pair<line, int> > dq;
        dq.push_back({{0, 0}, 0});
        for (int i = 1; i <= n; i++) {
            while (dq.size() >= 2 && f(dq[0].fi, s[i]) <= f(dq[1].fi, s[i])) dq.pop_front();
            dp[i][c] = f(dq[0].fi, s[i]);
            p[i][c] = dq[0].se;
            if (dp[i][c-1] == LLONG_MIN) continue;
            line cur = line(s[i], dp[i][c-1] - 1LL * s[i] * s[i]);
            if (dq.back().fi.a == cur.a) {
                if (dq.back().fi.b > cur.b) continue;
                dq.pop_back();
            }
            while (dq.size() >= 2 && dq.back().fi.intersectX(cur) <= dq.back().fi.intersectX(dq[dq.size()-2].fi)) dq.pop_back();
            dq.push_back({cur, i});
        }
    }
    cout << dp[n][k] << "\n";
    int oz = p[n][k];
    vector<int> Ans;
    for (int i = k-1; i >= 1; i--) {
        Ans.emplace_back(oz);
//        assert(oz);
        oz = p[oz][i];
    }
    reverse(Ans.begin(), Ans.end());
    for (int i : Ans) cout << i << ' ';
}
| # | 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... |