#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define maxn 510000
#define ll long long
ll f[maxn],sum[maxn],q[maxn],x[maxn];
ll m,n,h,t,L;
ll M(ll k) {return k*k;}
double getk(ll k,ll j)
{
return (f[k]-f[j]+M(sum[k]+L)-M(sum[j]+L))/2.0/(sum[k]-sum[j]);
}
int main()
{
scanf("%lld%lld",&n,&L);
L++;
for(int i=1;i<=n;i++)
{
scanf("%lld",&x[i]);
x[i]+=x[i-1];
sum[i]=x[i]+i;
}
q[1]=0;
h=t=1;
for(int i=1;i<=n;i++)
{
while(h<t&&getk(q[h+1],q[h])<double(sum[i]+1)) h++;
f[i]=f[q[h]]+M(sum[i]-sum[q[h]]-L);
while(h<t&&getk(q[t],q[t-1])>getk(i,q[t])) t--;
q[++t]=i;
}
printf("%lld",f[n]);
return 0;
}
斜率dp,涨姿势~
bzoj1010: [HNOI2008]玩具装箱toy 斜率优化DP
最新推荐文章于 2020-01-30 11:11:19 发布