#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 = l;
for (ll k = l; k <= min(mid, r); 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] = (mx==NEG ? -1 : best);
solve(id, i, mid-1, l, best);
solve(id, mid+1, j, 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;
pref.assign(n+1, 0);
for (int i = 0; i < n; i++) pref[i+1] = pref[i] + v[i];
dp.assign(n, vector<ll>(k+1, NEG));
pr.assign(n, vector<ll>(k+1, -1));
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> vl;
for (int i = 0; i < k; i++) {
ll idx = pr[cur][k-i];
if (idx == -1) break;
vl.push_back(idx+1);
cur = idx;
}
reverse(vl.begin(), vl.end());
for (int i = 0; i < vl.size(); i++) {
cout << vl[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... |