解题:HNOI 2008 玩具装箱
搞了一晚上斜率优化,大概懂了一点,写写
原来常用的优化dp方法:做前缀和,预处理,数据结构维护
现在有转移方程长这样的一类dp:$dp[i]=min(dp[i],k[i]*x[j]+y[j]+c[i]+a)$,其中$c[i],k[i],x[j],y[j]$都是关于$i$或者$j$的变量,在$i$或者$j$确定时不变,$a$是个常量
然后发现$x[j]$带着一个$k[i]$的系数,不好优化
从另一个角度考虑,想想高中老师教给我们的线性规划
可以发现因为对于每次转移的$i$来说$c[i],k[i]$都不变,我们可以把$k[i]*x[j]+y[j]$看做是一条直线(初中的一次函数),$k[i]$是斜率,然后$x[j]$是横坐标,$y[j]$是纵坐标,别的都是关于$i$的变量或者常量,不用管。那么实际上我们求的$dp$数组的最终结果就是这条直线的截距的最值(初中的与y轴的交点)
然后我们发现发现对于每个下标我们都可以依照上面的$x[j],y[j]$把它表示成平面上的一个点$(x,y)$,然后这些点会形成一个点集,根据线性规划的知识,可以发现根据斜率的正/负我们的最优决策点都在下/上凸包上,于是可以优化了
当我们每次转移用到的斜率单调时,直接用单调队列维护凸包,先把斜率大/小的都踢掉,转移之后再把现在不在凸包上的点也都踢掉,最后把当前点加进去
当我们每次转移用到的斜率不单调时,就不能根据斜率直接踢了,但仍然用单调队列维护凸包,只是把找最优决策点用二分代替
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
long long len[N],dp[N],que[N],n,x,f,b;
inline long long c1(int p){return len[p]+p;}
inline long long c2(int p){return c1(p)+x+;}
inline long long K(int p){return *c1(p);}
inline long long X(int p){return c2(p);}
inline long long Y(int p){return c2(p)*c2(p)+dp[p];}
inline long long S(int a,int b){return (double)(Y(b)-Y(a))/(double)(X(b)-X(a));}
int main()
{
scanf("%lld%lld",&n,&x);
for(int i=;i<=n;i++)
scanf("%lld",&len[i]),len[i]+=len[i-];
que[f=b=]=;
for(int i=;i<=n;i++)
{
while(b-f>=&&S(que[f],que[f+])<K(i)) f++;
dp[i]=dp[que[f]]+(c1(i)-c2(que[f]))*(c1(i)-c2(que[f]));
while(b-f>=&&S(que[b-],i)<S(que[b],que[b-])) b--; que[++b]=i;
}
printf("%lld",dp[n]);
return ;
}
解题:HNOI 2008 玩具装箱的更多相关文章
- [HNOI 2008]玩具装箱
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压 缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1.. ...
- [bzoj 1010][HNOI 2008]玩具装箱
传送门 Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压 缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号 ...
- BZOJ 1010 (HNOI 2008) 玩具装箱
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MB Submit: 12665 Solved: 5540 [Submit][S ...
- 玩具装箱&土地购买
今天一天8h 写了两道斜率优化的题(别问我效率为什么这么低 代码bug太多了) 关键是思考的不周全 估计是写的题少手生 以后就会熟练起来了吧. 这道题显然有一个n^2的dp方程 设f[i]表示前i件物 ...
- [补档][HNOI 2008]GT考试
[HNOI 2008]GT考试 题目 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字. 他的不吉利数学A1A2... ...
- WIKIOI 1319 玩具装箱
1319 玩具装箱 题目描述 Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维 ...
- BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9812 Solved: 3978[Submit][St ...
- 【BZOJ-1010】玩具装箱toy DP + 斜率优化
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8432 Solved: 3338[Submit][St ...
- C++之路进阶——codevs1319(玩具装箱)
1319 玩具装箱 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description P教授要去看奥运,但是他舍不下他的玩具,于是 ...
随机推荐
- [转]Git 撤销操作
二. Git撤消操作 12.1 修改最后一次提交 git commit --amend 1.新建一个文件 2.提交一个之前的更改 3.跟踪这个文件 4.跟前一次一起提交 提示你是否重新编辑提交说明,如 ...
- 2.5星|《哈佛商学院管理与MBA案例全书》:书名太唬人了,依据中文经管书汇编整理而成
哈佛商学院管理与MBA案例全书(套装十册) 看到最后,列出的参考书目中全部是中文经管书,才明白这本书不是哈佛商学院出版的,是国内的编辑做的汇编.参考书目中除了中文经管书之外,还有一套<哈佛商学院 ...
- Centos7.2部署saltstack
原文发表于cu:2016-06-23 参考文档: Saltstack安装文档:https://repo.saltstack.com/#rhel saltstack的安装与简单配置,应用. 一.环境 S ...
- [CF1137]Museums Tour
link \(\text{Description:}\) 一个国家有 \(n\) 个城市,\(m\) 条有向道路组成.在这个国家一个星期有 \(d\) 天,每个城市有一个博物馆. 有个旅行团在城市 \ ...
- LearnPython - Zip格式文件的解压缩
import zipfile import os def unzip(zip_name, target_dir): files = zipfile.ZipFile(zip_name) for zip_ ...
- Linux 配置网络连接
在VMware里,依次点击”编辑“ - ”虚拟网络编辑器“,如下图,我选择的是NAT模式: 在这个界面接着点"NAT设置",查看虚拟机的网关,这个网关在第三步要用.我这里的网关是1 ...
- hadoop的safemode 安全模式
hadoop启动检查副本块数,就会进入safemode safemode的相关情况 虽然不能进行修改文件的操作,但是可以浏览目录结构.查看文件内容的. 在命令行下是可以控制安全模式的进入.退出和查看的 ...
- 每天一个linux命令集
linux命令汇总,装载来自: http://www.cnblogs.com/peida/category/309012.html
- xpath获取同级元素
XPath轴(XPath Axes)可定义某个相对于当前节点的节点集: 1.child 选取当前节点的所有子元素 2.parent 选取当前节点的父节点 3.descendant 选取当前节点的所有后 ...
- 食物链 POJ 1182(种类并查集)
Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...