#include <bits/stdc++.h>
using namespace std;
int64_t prefix[100001] , maxim[100001][202];
int sursa[100001][202];
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][actual - 1] + (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][actual] = 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); }
cout << maxim[lungime][dorit] << '\n';
int stiva[202] = { };
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;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |