求助
  • 板块灌水区
  • 楼主_FJqwq
  • 当前回复9
  • 已保存回复9
  • 发布时间2022/12/9 22:36
  • 上次更新2023/10/26 23:59:42
查看原帖
求助
755947
_FJqwq楼主2022/12/9 22:36

P3195

#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
typedef long long ll;


ll n,s,a[50005],b[50005],c[50005],f[50005],q[50005],l,r;
ll qy(ll x)
{
	return f[x]+b[x]*b[x];
}
int main()
{
	scanf("%lld%lld",&n,&s);
	for(int i=1;i<=n;i++)
		scanf("%lld",&c[i]);
	for(int i=1;i<=n;i++)
		c[i]+=c[i-1];
	for(int i=1;i<=n;i++)
		c[i]+=i;
	for(int i=1;i<=n;i++)
		a[i]=c[i];
	for(int i=1;i<=n;i++)
		b[i]=c[i]+s+1;
	q[l=r=1]=0;
	for(int i=1;i<=n;i++)
	{
		while(l<r&&qy(q[l+1])-qy(q[l])<=(b[q[l+1]]-b[q[l]])*2*a[i])
			l++;
		f[i]=qy(q[l])-2*a[i]*b[q[l]]+a[i]*a[i];
		while(l<r&&(qy(q[r])-qy(q[r-1]))*(b[i]-b[q[r]])>=(qy(i)-qy(q[r]))*(b[q[r+1]]-b[q[r]]))
			r--;
		q[++r]=i;
	}
	return printf("%lld\n",f[n]),0;
}

2022/12/9 22:36
加载中...