您的位置:首页 > 其它

斜率优化专题4——bzoj 1911: [Apio2010] 特别行动队 题解

2014-05-05 22:07 357 查看
【原题】

1911: [Apio2010]特别行动队

Time Limit: 4 Sec  Memory Limit: 64 MB
Submit: 2134  Solved: 911

Description



Input



Output



Sample Input

4

-1 10 -20

2 2 3 4

Sample Output

9

HINT



【分析】只要跟着我前面的题目走,这道题真的是太水了。神马题解都不用参考,公式随便推。

易知方程是f[i]=max(f[j]+A*(sum[i]-sum[j])^2+B*(sum[i]-sum[j])+C)

设k比j优。

f[k]+A(sum[i]-sum[k])^2+B(sum[i]-sum[k])+C>f[j]+A(sum[i]-sum[j])^2+B(sum[i]-sum[j])+C

f[k]-2*A*sum[i]*sum[k]+A*sum[k]^2-B*sum[k]>f[j]-2*A*sum[i]*sum[j]+A*sum[j]^2-B*sum[j]

f[k]-f[j]+A*(sum[k]^2-sum[j]^2)+B*(sum[j]-sum[k])>2*A*sum[i]*(sum[k]-sum[j])

(f[k]-f[j]+A*(sum[k]^2-sum[j]^2)+B*(sum[j]-sum[k]))/2/(sum[k]-sum[j])/A<sum[i]

【代码】

#include<cstdio>
#include<algorithm>
using namespace std;
long long n,a[1000005],f[1000005],q[1000005],sum[1000005],ans,h,t,i,A,B,C,j;
long long M(long long x){return x*x;}
double xie(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 (i=1;i<=n;i++)
scanf("%lld",&a[i]),sum[i]=sum[i-1]+a[i];
f[0]=0;h=t=1ll;q[1]=0;
for (i=1;i<=n;i++)
{
while (h<t&&xie(q[h+1],q[h])<=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&&xie(q[t],q[t-1])>xie(i,q[t])) t--;
q[++t]=i;
}
printf("%lld",f
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  题解 bzoj 斜率优化