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

【斜率DP】BZOJ 1911:特别行动队

时间:2015-09-23 16:37:10      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:

1911: [Apio2010]特别行动队

Time Limit: 4 Sec  Memory Limit: 64 MB
Submit: 3006  Solved: 1360
[Submit][Status][Discuss]

Description

技术分享

Input

技术分享

Output

技术分享

Sample Input

4
-1 10 -20
2 2 3 4

Sample Output

9

HINT

技术分享


  很容易写出斜率式什么的就不说了。。
  不开long long见祖宗。。
  
技术分享
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstdio>
 5 
 6 #define maxn 1000001
 7 
 8 using namespace std;
 9 
10 long long sum[maxn],f[maxn];
11 
12 int a,b,c,n,que[maxn],head=1,tail=1;
13 
14 double K(int x,int y){return (double)(sum[x]+sum[y])/2.0+(double)(f[y]-f[x])/(2.0*a*(sum[y]-sum[x]))-(double)b/(2.0*a);}
15 
16 long long F(int x){return a*x*x+b*x+c;}
17 
18 void DP()
19 {
20     que[tail]=0;
21     for(int i=1;i<=n;i++)
22     {
23         while(head<tail && sum[i] >= K(que[head],que[head+1]))head++;
24         int sd=que[head];
25         f[i]=f[sd]+F(sum[i]-sum[sd]);
26         while(head<tail && K(que[tail],i) <= K(que[tail-1],que[tail]))tail--;
27         que[++tail]=i;
28     }
29     printf("%lld",f[n]);
30 }
31 
32 int main()
33 {
34     scanf("%d%d%d%d",&n,&a,&b,&c);
35     for(int i=1;i<=n;i++)scanf("%lld",&sum[i]),sum[i]+=sum[i-1];
36     DP();
37     return 0;
38 }
View Code

【斜率DP】BZOJ 1911:特别行动队

标签:

原文地址:http://www.cnblogs.com/tuigou/p/4832507.html

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