#include<cstdio>
#include<iostream>
#include<queue>
#define LL long long
using namespace std;
LL dp[50005];
LL t[50005],C;
LL f(LL x){ return t[x]+x; }
LL p(LL x){ return x*x; }
double get(int j,int k)
{
return (dp[k]-dp[j]+p(f(k)+C)-p(f(j)+C))/(2.0*(f(k)-f(j)));
}
int q[50010];
int main()
{
LL n,x;
scanf("%lld%lld",&n,&C);
C++;
for(int i=1;i<=n;i++)
{
scanf("%lld",&x);
t[i]=t[i-1]+x;
}
LL head=1,tail=1;
for(int k=1;k<=n;k++)
{
while(head<tail&&get(q[head],q[head+1])<=t[k]+k) head++;
x=q[head];
dp[k]=dp[x]+p(f(k)-f(x)-C);
while(head<tail&&get(q[tail],k)<get(q[tail-1],q[tail])) tail--;
q[++tail]=k;
}
printf("%lld",dp[n]);
return 0;
}
玩具装箱BZOJ1010 斜率优化
最新推荐文章于 2018-08-03 20:59:04 发布