Submission #548644

#TimeUsernameProblemLanguageResultExecution timeMemory
548644ZaniteSplit the sequence (APIO14_sequence)C++17
50 / 100
2076 ms7528 KiB
// "I assure you that you guys won't make it to the top 4"
// - Tzaph, 21 December 2021

#include <bits/stdc++.h>

#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

#define ll long long
#define ld long double
#define si short int
#define i8 __int128
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pld pair<ld, ld>
#define psi pair<si, si>
#define pi8 pair<i8, i8>
#define pq priority_queue
#define fi first
#define se second

#define sqr(x) ((x)*(x))
#define pow2(x) (1ll << (x))
#define debug(x) cout << #x << " = " << (x) << '\n'
#define debugV(x, a) cout << #x << "[" << (a) << "] = " << (x[a]) << '\n'

#define yume using
#define wo namespace
#define kanaeyo std

yume wo kanaeyo;

template<typename T> void chmin(T &a, T b) {a = min(a, b);}
template<typename T> void chmax(T &a, T b) {a = max(a, b);}
 
template<typename T> void maddto(T &a, T b, T mod) {a += b; a %= mod;}
template<typename T> void msubto(T &a, T b, T mod) {a -= b; while (a < 0) a += mod; a %= mod;}
template<typename T> void mmulto(T &a, T b, T mod) {a *= b; a %= mod;}
 
template<typename T> T madd(T a, T b, T mod) {a += b; a %= mod; return a;}
template<typename T> T msub(T a, T b, T mod) {a -= b; while (a < 0) a += mod; return a;}
template<typename T> T mmul(T a, T b, T mod) {a *= b; a %= mod; return a;}

const ll ModA = 998244353;
const ll ModC = 1e9 + 7;
const ll INF = 1e18;
const ll iINF = 1e9;

const ld EPS = 1e-9;
const ld iEPS = 1e-6;

const ll maxK = 202, maxN = 1e5 + 1;

ll n, k, a[maxN], pf[maxN];
ll dp[maxK][maxN], pred[maxK][maxN];

ll pref(ll l, ll r) {
	return pf[r] - pf[l-1];
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL);

	cin >> n >> k;
	for (ll i = 1; i <= n; i++) {
		cin >> a[i];
		pf[i] = pf[i-1] + a[i];
	}

	for (ll i = 1; i <= n; i++) {
		dp[0][i] = -INF;
	}

	for (ll x = 1; x <= k+1; x++) {
		for (ll i = 1; i <= n; i++) {
			dp[x][i] = -INF;
			if (i >= x) {
				for (ll j = x-1; j < i; j++) {
					ll cur = dp[x-1][j] + 1ll * pref(1, j) * pref(j+1, i);
					if (cur > dp[x][i]) {
						dp[x][i] = cur;
						pred[x][i] = j;
					}
				}
			}
		}
	}

	cout << dp[k+1][n] << '\n';
	for (ll i = k+1, cur = n; i > 1; i--) {
		cout << pred[i][cur] << ' ';
		cur = pred[i][cur];
	}
	cout << '\n';
}
#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...