【bzoj1010】【HNOI2008】【玩具装箱toy】【斜率优化】
2016-03-23 19:12
323 查看
Description
P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的。同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器的长度将为x=j-i+Sigma(Ck) i<=K<=j 制作容器的费用与容器的长度有关,根据教授研究,如果容器长度为x,其制作费用为(X-L)^2.其中L是一个常量。P教授不关心容器的数目,他可以制作出任意长度的容器,甚至超过L。但他希望费用最小.
Input
第一行输入两个整数N,L.接下来N行输入Ci.1<=N<=50000,1<=L,Ci<=10^7Output
输出最小费用Sample Input
5 43
4
2
1
4
Sample Output
1题解:斜率优化模板题。
代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=50100; long long sum ,L,f ; int l[1000000],n; long long pow(long long x){return x*x;} long long S(int x,int y){return sum[x]-sum[y];} long long G(int x,int y){return f[x]-f[y]+pow(sum[x]+L)-pow(sum[y]+L);} long long work(int x,int y){return (G(x,y)*1.0)/(S(x,y)*2.0);} int main() { int i,j,h=1,t=1; scanf("%d%lld",&n,&L); L+=1; for(i=1;i<=n;++i){ scanf("%lld",&sum[i]); sum[i]+=sum[i-1]; } for(i=1;i<=n;++i) sum[i]+=(long long)i; l[1]=0; for(i=1;i<=n;++i){ while(h<t&&sum[i]>=work(l[h+1],l[h])) h+=1; f[i]=f[l[h]]+pow(sum[i]-sum[l[h]]-L); while(h<t&&work(i,l[t])<=work(l[t],l[t-1])) t-=1; t+=1;l[t]=i; } printf("%lld\n",f ); }
相关文章推荐
- UVALive 7483 Air Conditioned Minions
- 约瑟夫初级源码
- longest continuous subsequence of 0s
- Unix环境高级编程---信号
- javascript中的this关键字小谈
- poj2420 模拟退火
- 好的博客(给自己翻译用)
- Python string modify
- 2016最新iOS开发证书配置和安装的详细步骤攻略
- 时间差处理
- Segmentation fault 问题浅谈
- 使用HorizontalScrollView实现侧滑效果(3)
- Python string compare
- Jena将owl文件持久化到数据库中
- TI AM335x 可编程实时模块(PRUSS)详解
- Python2.7<-------->Python3.x
- swift学习之定义常量、变量、字典、数组
- android全屏,隐藏状态栏
- bzoj 3171 [Tjoi2013]循环格(MCMF)
- ZOJ1180 Self Numbers 开始刷水题模式