Submission #1326381

#TimeUsernameProblemLanguageResultExecution timeMemory
1326381SSKMFSplit the sequence (APIO14_sequence)C++20
100 / 100
1209 ms81440 KiB
#include <bits/stdc++.h>
using namespace std;

int prefix[100001] , sursa[100001][202];
int64_t maxim[100001][2];

inline void Divide (const int actual , const int inceput , const int sfarsit , const int stanga , const int dreapta)
{
	if (inceput > sfarsit)
		{ return; }

	const int indice = (inceput + sfarsit) >> 1;
	pair <int64_t , int> optim = {INT64_MIN , -1};
	for (int __indice = stanga ; __indice <= min(dreapta , indice - 1) ; __indice++)
		{ optim = max(optim , {maxim[__indice][0] + 1LL * (prefix[indice] - prefix[__indice]) * prefix[__indice] , __indice}); }

	Divide(actual , inceput , indice - 1 , stanga , optim.second);
	Divide(actual , indice + 1 , sfarsit , optim.second , dreapta);
	sursa[indice][actual] = optim.second;
	maxim[indice][1] = optim.first;
}

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

	int lungime , dorit;
	cin >> lungime >> dorit;

	for (int indice = 1 ; indice <= lungime ; indice++)
		{ cin >> prefix[indice]; prefix[indice] += prefix[indice - 1]; }

	dorit++;
	for (int indice = 2 ; indice <= dorit ; indice++)
	{ 
		Divide(indice , indice , lungime , indice - 1 , lungime - 1);
		for (int __indice = indice ; __indice <= lungime ; __indice++)
			{ maxim[__indice][0] = maxim[__indice][1]; }	
	}

	cout << maxim[lungime][0] << '\n';

	int stiva[201] = { };
	for (int capat = lungime , indice = dorit ; sursa[capat][indice] ; capat = sursa[capat][indice--])
		{ stiva[++stiva[0]] = sursa[capat][indice]; }

	while (stiva[0])
		{ cout << stiva[stiva[0]--] << ' '; }

	return 0;
}
/*

dp[n][k] = max(dp[i][k - 1] + (pref[n] - pref[i]) * pref[i])
dp[n][k] = max(dp[i][k - 1] - pref[i] * pref[i] + pref[n] * pref[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...