您的位置:首页 > 其它

bzoj1911: [Apio2010]特别行动队 斜率优化DP

2014-07-22 11:27 295 查看
斜率优化dp,推公式就可以了。

/**************************************************************
Problem: 1911
User: xujiahe
Language: C++
Result: Accepted
Time:1756 ms
Memory:35648 kb
****************************************************************/

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define ll long long
#define maxn 1100000
ll f[maxn],sum[maxn],q[maxn],a[maxn];
ll A,B,C,m,n,h,t;
long long M(long long x){return x*x;}
double getk(long long k,long long j)
{
double temp=(f[k]-f[j]+A*(M(sum[k])-M(sum[j]))+B*(sum[j]-sum[k])+0.0)/2.0/(sum[k]-sum[j])/A;
return temp;
}
int main()
{
scanf("%lld",&n);
scanf("%lld%lld%lld",&A,&B,&C);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
}
h=t=1ll;
f[0]=0;
q[1]=0;
for(int i=1;i<=n;i++)
{
while(h<t&&getk(q[h+1],q[h])<=double(sum[i])) h++;
f[i]=f[q[h]]+A*M(sum[i]-sum[q[h]])+B*(sum[i]-sum[q[h]])+C;
while(h<t&&getk(q[t],q[t-1])>getk(i,q[t])) t--;
q[++t]=i;
}
printf("%lld",f
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: