Submission #1365622

#TimeUsernameProblemLanguageResultExecution timeMemory
1365622FaresSTHSplit the sequence (APIO14_sequence)C++20
71 / 100
2098 ms83780 KiB
#include"bits/stdc++.h"
using namespace std;
// #define int long long
#define S second
#define F first
const int maxx=6e8+5;
const int mxn=99999;
struct line{
	int m=1;
	long long b=0;
	int idx=-1;
	long long eval(int x){
		return 1ll*m*x+b;
	}
};
struct node{
	int lc=-1,rc=-1;
	bool ex=0;
	line li;
}tn[mxn*20];
int cnt=0;
int create(){
	cnt++;
	tn[cnt].ex=0;
	tn[cnt].lc=-1;
	tn[cnt].rc=-1;
	tn[cnt].li=line();
	return cnt;
}
void upd(line li,int i=1,int l=0,int r=maxx){
	int m=(l+r)/2;
	auto&v=tn[i];
	if(!v.ex){
		v.li=li;
		v.ex=1;
		return;
	}
	if(li.eval(m)>v.li.eval(m))swap(li,v.li);
	if(l==r)return;
	if(li.eval(l)>v.li.eval(l)){
		if(v.lc==-1)v.lc=create();
		upd(li,v.lc,l,m);
	}
	else if(li.eval(r)>v.li.eval(r)){
		if(v.rc==-1)v.rc=create();
		upd(li,v.rc,m+1,r);
	}
}
pair<long long,int>qry(int x,int i=1,int l=0,int r=maxx){
	auto&v=tn[i];
	pair<long long,int>res={-1,-1};
	if(l>x||r<x)return res;
	res=max(res,{v.li.eval(x),v.li.idx});
	if(l==r)return res;
	int m=(l+r)/2;
	if(x<=m){
		if(v.lc==-1)return res;
		return max(res,qry(x,v.lc,l,m));
	}
	if(v.rc==-1)return res;
	return max(res,qry(x,v.rc,m+1,r));
}
signed main(){
	cin.tie(0)->sync_with_stdio(0);
	int n,k;
	cin>>n>>k;
	int a[n+1],p[n+1]={};
	for(int i=1;i<=n;i++){
		cin>>a[i];
		p[i]=p[i-1]+a[i];
	}
	int pr[n+1][k+1]={};
	long long dp[n+1][2]={};
	for(int j=1;j<=k;j++){
		create();
		for(int i=j+1;i<=n;i++){
			upd(line{p[i-1],dp[i-1][0]-1ll*p[i-1]*p[i-1],i-1});
			auto q=qry(p[i]);
			dp[i][1]=q.F;
			pr[i][j]=q.S;
			dp[i-1][0]=dp[i-1][1];
		}
		dp[n][0]=dp[n][1];
		cnt=0;
	}
	cout<<dp[n][0]<<'\n';
	while(k){
		cout<<pr[n][k]<<' ';
		n=pr[n][k],k--;
	}
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...