Submission #498469

#TimeUsernameProblemLanguageResultExecution timeMemory
498469StickfishSplit the sequence (APIO14_sequence)C++17
71 / 100
421 ms131076 KiB
#include <iostream> using namespace std; using ll = long long; const ll INF = 1.77013e18; const int MAXN = 100004; const int MAXK = 202; ll a[MAXN]; ll psm_[MAXN]; ll psqsm_[MAXN]; ll* psm = psm_ + 1; ll* psqsm = psqsm_ + 1; ll dp_[MAXK][MAXN]; ll* dp[MAXN]; ll opt[MAXK][MAXN]; void get_layer(int t, int l, int r, int pl, int pr) { if (r - l <= 0) return; int m = (l + r) / 2; opt[t][m] = pl; for (int i = pl; i <= pr && i < m; ++i) { ll sqsm = psqsm[m] - psqsm[i]; ll sm = psm[m] - psm[i]; if (dp[t][m] > dp[t - 1][i] + (sm * sm - sqsm) / 2) { dp[t][m] = dp[t - 1][i] + (sm * sm - sqsm) / 2; opt[t][m] = i; } } get_layer(t, l, m, pl, opt[t][m]); get_layer(t, m + 1, r, opt[t][m], pr); } signed main() { int n, k; cin >> n >> k; ++k; for (int i = 0; i < n; ++i) cin >> a[i]; for (int i = 0; i < k; ++i) { dp[i] = dp_[i] + 1; } for (int i = 0; i < n; ++i) { psm[i] = psm[i - 1] + a[i]; psqsm[i] = psqsm[i - 1] + a[i] * a[i]; dp[0][i] = (psm[i] * psm[i] - psqsm[i]) / 2; opt[0][i] = -1; } for (int t = 1; t < k; ++t) { for (int i = 0; i < n; ++i) { dp[t][i] = INF; } get_layer(t, t, n, t - 1, n - 1); } ll ans = 0; for (int i = 0; i < n; ++i) ans += a[i]; ans *= ans; for (int i = 0; i < n; ++i) ans -= a[i] * a[i]; ans /= 2; ans -= dp[k - 1][n - 1]; cout << ans << endl; int i = n - 1; int t = k; while (--t) { i = opt[t][i]; if (i != -1) { cout << i + 1 << ' '; } } cout << endl; }
#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...