Submission #259160

#TimeUsernameProblemLanguageResultExecution timeMemory
259160pure_memSplit the sequence (APIO14_sequence)C++14
100 / 100
1408 ms81496 KiB
#include <bits/stdc++.h>

#define ll long long
#define X first
#define Y second
#define MP make_pair
 
using namespace std;
 
const int N = 1e5 + 12;

int n, k, T, IT;
int gr[220][N];
ll pr[N], dp[2][N];

void rec(int tl, int tr, int tpl = 1, int tpr = n){
	if(tl > tr)
		return;
	int tm = (tl + tr) / 2, tp = 0;
	ll curs = -1;
	for(int i = max(tpl, IT - 1);i <= min(tm - 1, tpr);i++){
		if(dp[1 - T][i] + pr[i] * (pr[tm] - pr[i]) > curs)	
			curs = dp[1 - T][i] + pr[i] * (pr[tm] - pr[i]), tp = i;	
	}
	dp[T][tm] = curs, gr[IT][tm] = tp;
	rec(tl, tm - 1, tpl, tp);
	rec(tm + 1, tr, tp, tpr);
}

int main () {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
 
    cin >> n >> k;
    for(int i = 1;i <= n;i++){
    	cin >> pr[i];
    	pr[i] += pr[i - 1];
    }
    k += 1;
    for(int i = 2;i <= k;i++){
    	T = i & 1, IT = i;
    	rec(1, n);	
    }
    cout << dp[k & 1][n] << "\n";
    for(int j = k, pos = n;j > 1;j--){
    	cout << gr[j][pos] << " ";
    	pos = gr[j][pos];	
    }
}
#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...