初学斜率优化30pts求调
查看原帖
初学斜率优化30pts求调
324226
X2H_tato楼主2024/6/21 09:29
#include <bits/stdc++.h>
using namespace std;
const int N=5e4+5;
long long sadd[N],dp[N],f[N];
long long g[N];
int q[N];

double xie (int x,int y)
{
	return (double)((dp[y]+g[y]-dp[x]-g[x])/(f[y]-f[x]));
}

int main()
{
	int n,L;
	scanf("%d%d",&n,&L);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&sadd[i]);
		sadd[i]+=sadd[i-1];
		f[i]=sadd[i]+i;
		g[i]=(f[i]+L+1)*(f[i]+L+1);
	}
	int l=1,r=1;
	g[0]=(L+1)*(L+1);
	for(int i=1;i<=n;i++)
	{
		while(l<r&&xie(q[l],q[l+1])<2*f[i]) l++;
		dp[i]=dp[q[l]]+(f[i]-f[q[l]]-1-L)*(f[i]-f[q[l]]-1-L);
		while(l<r&&xie(q[r],i)<xie(q[r-1],q[r])) r--;
		q[++r]=i;
		//cout<<dp[i]<<" ";
	} 
	cout<<dp[n];
	return 0;
} 
2024/6/21 09:29
加载中...