萌新求助斜率优化
查看原帖
萌新求助斜率优化
376997
Harry27182SDream楼主2022/9/2 15:13

rt,洛谷 AC,UOJ WA on #33,调不出来了,求调

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k,x,s[100005],f[100005],g[100005],q[100005],fa[205][100005],ans[205];
double calc(int x,int y)
{
	if(s[x]==s[y])return -1e9;
	return 1.0*((g[y]-s[y]*s[y])-(g[x]-s[x]*s[x]))/(-s[y]-(-s[x]));
}
signed main()
{
	scanf("%lld%lld",&n,&k);
	for(int i=1;i<=n;i++)scanf("%lld",&x),s[i]=s[i-1]+x;
	for(int j=1;j<=k;j++)
	{
		for(int i=1;i<=n;i++)g[i]=f[i];
		int head=1,tail=0;
		for(int i=1;i<=n;i++)
		{
			while(head<tail&&calc(q[head],q[head]+1)<(double)s[i])head++;
			f[i]=g[q[head]]+(s[q[head]])*(s[i]-s[q[head]]);
			fa[j][i]=q[head];
			while(head<tail&&calc(q[tail-1],q[tail])>calc(q[tail],i))tail--;
			q[++tail]=i;
		}
	}
	printf("%lld\n",f[n]);
	int now=n;
	for(int i=k;i>=1;i--)ans[i]=now=fa[i][now];
	for(int i=1;i<=k;i++)printf("%lld ",ans[i]);
	return 0;
}
2022/9/2 15:13
加载中...