Submission #989391

#TimeUsernameProblemLanguageResultExecution timeMemory
989391BuzzyBeezSplit the sequence (APIO14_sequence)C++17
100 / 100
1069 ms82928 KiB
#include <bits/stdc++.h>
using namespace std;

const long long inf = 1e18;

long long dp[2][100008];
int par[208][100008];
long long pf[100008], pf_sq[100008];

long long x, y;
long long f(int l, int r) {
	x = pf[r] - pf[l - 1]; y = pf_sq[r] - pf_sq[l - 1];
	return (x * x - y) / 2;
}

void DP(int level, int l, int r, int optl, int optr) {
	if (l > r) return;
	int mid = (l + r) / 2, start = min(mid - 1, optr), optm = 0;
	int cur = (level & 1);
	dp[cur][mid] = inf;
	for (int i = start; i >= optl; --i) {
		if (dp[cur][mid] > dp[cur ^ 1][i] + f(i + 1, mid)) {
			dp[cur][mid] = dp[cur ^ 1][i] + f(i + 1, mid);
			par[level][mid] = optm = i;
		}
	}
	// cout << level << ' ' << mid << ' ' << optl << ' ' << optr << ' ' << optm << ' ' << dp[cur][mid] << "!!\n";
	DP(level, l, mid - 1, optl, optm); DP(level, mid + 1, r, optm, optr);
}

signed main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	int n, k; cin >> n >> k; ++k;
	for (int i = 1; i <= n; ++i) {
		cin >> x;
		pf[i] = pf[i - 1] + x;
		pf_sq[i] = pf_sq[i - 1] + x * x;
	}
	for (int i = 1; i <= n; ++i) dp[0][i] = inf;
	for (int i = 1; i <= k; ++i) {
		dp[i & 1][0] = inf; fill(dp[i & 1] + 1, dp[i & 1] + n + 1, 0);
		DP(i, 1, n, 0, n - 1);
	}
	cout << f(1, n) - dp[k & 1][n] << '\n'; int pt = n;
	vector<int> cuts;
	for (int i = k; i > 1; --i) cuts.push_back(par[i][pt]), pt = par[i][pt];
	reverse(cuts.begin(), cuts.end());
	for (int i : cuts) cout << i << ' ';
}
#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...