Submission #1290542

#TimeUsernameProblemLanguageResultExecution timeMemory
1290542AMel0nSplit the sequence (APIO14_sequence)C++20
0 / 100
1 ms336 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
#define FOR(i,N) for(ll i = 0; i < N; i++)
#define all(x) (x).begin(), (x).end()
#define F first
#define S second

// APIO 14 Split The Sequence
/*
dp[k][m] = max score if we made k splits and the kth split was just before index m
dp[k][m] = max of: dp[k-1][i] + (ps[m-1]-p[i-1]) * (ps[N-1]-p[m-1]) for all (0 <= i < m)
nxt[k][m] = i where i was the optimal preceeding split point for split point m
*/

const ll INF = 1e18;
const ll MAXN = 1e5 + 5;
const ll MAXK = 205;
ll N, K, PS[MAXN], dp[MAXK][MAXN], nxt[MAXK][MAXN];

void solve(ll l, ll r, ll lOpt, ll rOpt, ll k) {
    if (l > r) return ;
    ll m = (l + r) / 2;
    pair<ll,ll> bsf = {-INF, -1};

    for(ll i = lOpt; i <= min(m-1, rOpt); i++) {
        ll bruh = dp[k-1][i] + (PS[m-1] - PS[i-1]) * (PS[N-1] - PS[m-1]);
        bsf = max(bsf, {bruh, i});
    }
    nxt[k][m] = bsf.S;
    dp[k][m] = bsf.F;
    // cout << l << ' ' << r << ' ' << lOpt << ' ' << rOpt << ' ' << k << ' ' << dp[k][m] << ' ' << dp[k-1][nxt[k][m]] << ' '  << nxt[k][m] << endl;
    solve(l, m-1, lOpt, bsf.S, k);
    solve(m+1, r, bsf.S, rOpt, k);
}

signed main() {
    cin.tie(0); ios::sync_with_stdio(false);
    cin >> N >> K;
    FOR(i, N) {
        cin >> PS[i];
        if (i) PS[i] += PS[i-1];
    }
    for(ll k = 1; k <= K; k++) solve(0, N-1, 0, N-1, k);
    ll bsf = -INF;
    ll idx = -1;
    FOR(i, N) {
        if (bsf < dp[K][i]) {
            bsf = dp[K][i];
            idx = i;
        }
    }
    cout << bsf << endl << idx+1 << ' ';
    for(ll k = K-1; k > 0; k--) {
        cout << nxt[k][idx]+1 << ' ';
        idx = nxt[k][idx];
    }
}
#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...