Submission #1339304

#TimeUsernameProblemLanguageResultExecution timeMemory
1339304javkhlantogsSplit the sequence (APIO14_sequence)C++20
100 / 100
599 ms83732 KiB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct line{
	ll m,b,from;
	// y=mx+b;
};
deque<line> dq;
bool check(line l1,line l2,line l3){
	if(l1.m==l2.m and l1.b>=l2.b) return true;
	if((l2.b-l3.b)*(l2.m-l1.m)<=(l1.b-l2.b)*(l3.m-l2.m)) return true;
	return false;
}
void add(line l){
	while(dq.size()>=2 and check(dq[dq.size()-2],dq[dq.size()-1],l)){
		dq.pop_back();
	}
	dq.push_back(l);
}
pair<ll,ll> query(ll x){
	while(dq.size()>=2 and dq[0].m*x+dq[0].b<=dq[1].m*x+dq[1].b){
		dq.pop_front();
	}
	return {dq[0].m*x+dq[0].b,dq[0].from};
}
int main(){
	ll n,k,i,j,q;
	cin>>n>>k;
	vector<ll> a(n+1),pre(n+2,0);
	for(i=1 ; i<=n ; i++) cin>>a[i];
	for(i=1 ; i<=n ; i++) pre[i]=pre[i-1]+a[i];
	vector<ll> dp1(n+1),dp2(n+1);
	vector<vector<int>> par(k+1,vector<int>(n+1));
	for(i=1 ; i<=k ; i++){
		dq.clear();
		add({0,0,0});
		for(j=1 ; j<=n ; j++){
			// dp2[j]=dp1[q]+(pre[j]-pre[q])*pre[q]
			// dp2[j]=pre[q]*pre[j]+dp1[q]-pre[q]^2
			pair<ll,ll> val=query(pre[j]);
			dp2[j]=val.first;
			par[i][j]=val.second;
			add({pre[j],dp1[j]-pre[j]*pre[j],j});
		}
		swap(dp2,dp1);
	}
	cout<<dp1[n]<<"\n";
	ll u=n;
	for(i=k ; i>=1 ; i--){
		cout<<par[i][u]<<" ";
		u=par[i][u];
	}	
	return 0;
}
#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...