Submission #989532

#TimeUsernameProblemLanguageResultExecution timeMemory
989532thdh__Split the sequence (APIO14_sequence)C++17
0 / 100
49 ms131072 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")

#pragma GCC target("avx,avx2,fma")
#define ll long long
#define pb push_back
#define pu push
#define ins insert
#define bruh ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ff(x,a,b,c) for (auto x=a;x<=b;x+=c)
#define fd(x,a,b,c) for (auto x=a;x>=b;x-=c)
#define int ll

using namespace std;

const int inf = 1e18;
const int N = 1e5+10;
int n,m;
vector<int> dp_before, dp_cur;
int pref[N];
int btrk[N][210];

long long C(int i, int j)
{
	return (pref[j]-pref[i-1])*pref[i-1];
}

void compute(int l, int r, int optl, int optr,int i) {
    if (l > r) return;
    int mid = (l + r)/2;
    pair<int, int> best = {-inf, -1};
    for (int k = optl; k <= min(mid, optr); k++) {
        best = max(best, {(k ? dp_before[k - 1] : 0) + C(k,mid), k});
    }
    btrk[mid][i] = best.second-1;
    dp_cur[mid] = best.first;
    int opt = best.second;
    compute(l, mid - 1, optl, opt,i);
    compute(mid + 1, r, opt, optr,i);
}

long long solve1() {
    dp_before.resize(n+1,0);
    dp_cur.resize(n+1,0);
    for (int i = 1; i <= n; i++) dp_before[i] = C(1,i);
    for (int i = 2; i <= m+1; i++) {
        compute(1, n , 1, n, i);
        for(int i=0;i<=n;i++) dp_cur[i] = dp_before[i];
    }
    return dp_before[n];
}

void solve()
{
	cin>>n>>m;
	vector<int> s(n+1);
	int sum = 0;
	for (int i=1;i<=n;i++) cin>>s[i],sum+=s[i];
	for (int i=1;i<=n;i++) pref[i] = pref[i-1]+s[i];;
	int ans = solve1();
	cout<<ans<<endl;
	int i=n,j=m+1;
	while(j>0){
		if(btrk[i][j]) cout<<btrk[i][j]<<" ";
		i = btrk[i][j]; j--;
	}
}

signed main()
{
	bruh
	int t = 1;
	//cin>>t;
	while (t--)
	{
		solve();
		cout<<endl;
	}
}
#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...