Submission #1271295

#TimeUsernameProblemLanguageResultExecution timeMemory
1271295bbldrizzySplit the sequence (APIO14_sequence)C++20
71 / 100
90 ms196608 KiB
#include <bits/stdc++.h>
#include <ios>
#include <iostream>
using namespace std;
using ll = long long;
using P = pair<int, int>;
#define f first
#define s second
const int MOD = 1e9+7;
const ll MX = 4*1e18;
const ll NEG = numeric_limits<ll>::min()/4;
vector<ll> pref;
vector<vector<ll>> dp;
vector<vector<ll>> pr;

void solve(ll id, ll i, ll j, ll l, ll r) {
    if (i > j) return;
    ll mid = (i+j)/2;
    ll mx = NEG;
    ll best = -1;
    ll ub = min(mid-1, r);           // forbid k == mid (no empty segment)
    if (l <= ub) {
        for (ll k = l; k <= ub; k++) {
            if (dp[k][id-1] == NEG) continue;
            ll v = dp[k][id-1] + pref[k+1]*(pref[mid+1]-pref[k+1]);
            if (v > mx) { best = k; mx = v; }
        }
    }
    dp[mid][id] = mx;
    pr[mid][id] = best;
    solve(id, i, mid-1, l, (best==-1? l : best));
    solve(id, mid+1, j, (best==-1? mid : best), r);
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(nullptr);
    ll n, k; cin >> n >> k;
    vector<ll> v(n);
    for (auto &x: v) cin >> x;
    dp.assign(n, vector<ll>(k+1, NEG));
    pr.assign(n, vector<ll>(k+1, -1));
    pref.assign(n+1, 0);
    for (int i = 0; i < n; i++) pref[i+1] = pref[i] + v[i];
    for (int i = 0; i < n; i++) dp[i][0] = 0;
    for (int i = 1; i <= k; i++) solve(i, 0, n-1, 0, n-1);
    cout << dp[n-1][k] << "\n";
    ll cur = n-1;
    vector<ll> parts;
    for (int i = 0; i < k; i++) {
        if (cur < 0) break;
        ll idx = pr[cur][k-i];
        if (idx == -1) break;
        parts.push_back(idx+1);
        cur = idx;
    }
    reverse(parts.begin(), parts.end());
    string s1 = "";
    for (int i = 0; i < (int)parts.size(); i++) {
        if (i) s1 += " ";
        s1 += to_string(parts[i]);
    }
    cout << s1;
}
#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...