您的位置:首页 > 其它

bzoj1010: [HNOI2008]玩具装箱toy 斜率优化DP

2014-07-21 18:39 423 查看
#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
);
return 0;
}
斜率dp,涨姿势~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: