码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj1911

时间:2017-09-03 22:05:06      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:i++   comm   rip   out   turn   online   bzoj1911   print   cstring   

【bzoj1911】[Apio2010]特别行动队commando

Description

技术分享

Input

技术分享

Output

技术分享

Sample Input

4
-1 10 -20
2 2 3 4

Sample Output

9

HINT

技术分享

题解

我发现似乎掌握了特殊的斜率优化技巧,我会假装四处看风景

dp方程:f[i]=max(f[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c)

如果j>k且j比k更优

f[j]-f[k]+a*sum[j]^2-a*sum[k]^2+b*(sum[k]-sum[j])>2*a*(sum[j]-sum[k])*sum[i]

转引自hzw的blog,太懒了,什么都没剩下,这道题还是普普通通的斜率优化裸题

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #define ll long long
 7 
 8 using namespace std;
 9 
10 const int NN=1e6+7;
11 
12 int n,l,r;
13 int a,b,c;
14 int x[NN],q[NN];
15 ll sum[NN],f[NN];
16 
17 ll sqr(ll x)
18 {
19     return x*x;
20 }
21 double slop(int k,int j)
22 {
23     return (double)(f[j]-f[k]+a*(sqr(sum[j])-sqr(sum[k]))+b*(sum[k]-sum[j]))/(double)(2*a*(sum[j]-sum[k]));
24 }
25 int main()
26 {
27     scanf("%d%d%d%d",&n,&a,&b,&c);
28     for(int i=1;i<=n;i++)
29     {
30         scanf("%d",&x[i]);
31         sum[i]=sum[i-1]+x[i];
32     }
33     for(int i=1;i<=n;i++)
34     {
35         while(l<r&&slop(q[l],q[l+1])<sum[i]) l++;//因为a<0我去
36         int t=q[l];
37         f[i]=f[t]+a*sqr(sum[i]-sum[t])+b*(sum[i]-sum[t])+c;
38         while(l<r&&slop(q[r-1],q[r])>slop(q[r],i)) r--;
39         q[++r]=i;
40     }
41     printf("%lld",f[n]); 
42 }

 

bzoj1911

标签:i++   comm   rip   out   turn   online   bzoj1911   print   cstring   

原文地址:http://www.cnblogs.com/fengzhiyuan/p/7471012.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!