求助
查看原帖
求助
552699
_aknoip_楼主2023/8/17 17:26

33分 评测记录

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
int n,m,f[210][N],sum[N],ans,g[210][N];
int x(int i){return sum[i];}
int y(int k,int i){return f[k-1][i]-sum[i]*sum[i];}
void print(int k,int x)
{
	if(g[k-1][x])print(k-1,g[k-1][x]);
	cout<<x<<" ";
}
signed main(){
	/*f[k][i]=f[k-1][j]+sum[j]*(sum[i]-sum[j]);
	f[k][i]=f[k-1][j]+sum[j]*sum[i]-sum[j]*sum[j];
	f[k-1][j]-sum[j]*sum[j]=f[k][i]-sum[j]*sum[i];*/
	cin>>n>>m;
	int o;
	for(int i=1;i<=n;i++)cin>>o,sum[i]=sum[i-1]+o; 
	for(int k=1;k<=m;k++)
	{
		int q[N],l=1,r=1;
		q[1]=0;
		for(int i=1;i<=n;i++)
		{
			while(l<r&&y(k,q[l])-y(k,q[l+1])<=sum[i]*(x(q[l+1])-x(q[l])))l++;
			f[k][i]=f[k-1][q[l]]+sum[q[l]]*(sum[i]-sum[q[l]]);
			g[k][i]=q[l];
			while(l<r&&(y(k,q[r-1])-y(k,q[r]))*(x(i)-x(r))<=(y(k,i)-y(k,q[r]))*(x(q[r])-x(q[r-1])))r--;
			q[++r]=i;
		}
	}
	cout<<f[m][n]<<endl;
	print(m,g[m][n]);
	return 0;
}
2023/8/17 17:26
加载中...