您的位置:首页 > 其它

bzoj 1911: [Apio2010]特别行动队

2016-03-18 05:43 323 查看
#include<cstdio>
#include<iostream>
#define M 1000009
#define ll long long
using namespace std;
int n,zhan[M],h,t;
ll a,b,c,f[M],sum[M];
double pai(int a1,int a2)
{
double ss=(f[a1]-f[a2])/(1.0*a*(sum[a2]-sum[a1]));
return ss-sum[a2]-sum[a1];
}
int main()
{
scanf("%d%lld%lld%lld",&n,&a,&b,&c);
for(int i=1;i<=n;i++)
{
int a1;
scanf("%lld",&a1);
sum[i]=sum[i-1]+a1;
}
h=0;
for(int i=1;i<=n;i++)
{
for(;h<t&&pai(zhan[h],zhan[h+1])>=-b/(1.0*a)-2*sum[i];h++);
f[i]=f[zhan[h]]+a*(sum[zhan[h]]-sum[i])*(sum[zhan[h]]-sum[i])+b*(sum[i]-sum[zhan[h]])+c;
for(;h<t&&pai(zhan[t-1],zhan[t])<=pai(zhan[t],i);t--);
zhan[++t]=i;
}
printf("%lld\n",f
);
return 0;
}


普通的斜率优化DP。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: