【bzoj1911】【APIO2010】【特别行动队】【斜率优化】
2016-03-23 19:00
295 查看
Description
![](http://www.lydsy.com/JudgeOnline/images/1911_1.jpg)
Input
![](http://www.lydsy.com/JudgeOnline/images/1911_2.jpg)
Output
![](http://www.lydsy.com/JudgeOnline/images/1911_3.jpg)
Sample Input
4-1 10 -20
2 2 3 4
Sample Output
9HINT
![](http://www.lydsy.com/JudgeOnline/images/1911_4.jpg)
题解:写出dp方程之后斜率优化即可。维护一个上凸壳。
代码:
#include<iostream>
#include<cstdio>
#define N 1000100
using namespace std;
int q
,n,h(1),t(1);
long long a,b,c,sum
,f
,v
;
long long pow(long long x){return x*x;}
long long G(int x,int y){return f[x]-f[y]+a*(pow(sum[x])-pow(sum[y]))+b*(sum[y]-sum[x]);}
long long S(int x,int y){return a*(sum[x]-sum[y]);}
double cal(int x,int y){return (G(x,y)*1.0)/(S(x,y)*2.0);}
int main(){
scanf("%d",&n);scanf("%lld%lld%lld",&a,&b,&c);
for (int i=1;i<=n;i++){scanf("%lld",&v[i]);sum[i]=sum[i-1]+v[i];}
for (int i=1;i<=n;i++){
while (h<t&&sum[i]>cal(q[h+1],q[h]))h++;
f[i]=f[q[h]]+a*pow(sum[i]-sum[q[h]])+b*(sum[i]-sum[q[h]])+c;
while (h<t&&cal(i,q[t])<cal(q[t],q[t-1])) t--;
q[++t]=i;
}
cout<<f
<<endl;
}
相关文章推荐
- 中文分词技术(中文分词原理)
- ClassLoader源码
- Reverse Nodes in k-Group
- Js自定义排序
- UESTC 1012 (思维)(找规律)
- POJ 1284 Primitive Roots 原根个数
- Ubuntu无法识别显示器情况下,高分辨率的设置
- iOS使用NSMutableAttributedString 实现富文本(不同颜色字体、下划线等)
- Java 多线程同步的五种方法
- C++求某年某月的天数
- zabbix3.0在php7环境下always_populate_raw_post_data的设置
- 3-19,3-20考试总结
- poj 2159Ancient Cipher
- web项目连接数据库的问题
- oracle-java-installer安装失败时候的操作
- RESTFul架构详解
- 关于Windows下mysql忘记root密码的解决方法
- 批量创建用户并设置随机密码
- Extjs 3.X 和 Extjs 4.x 为GridPanel动态添加一行数据的区别
- android系统各版本新特性