解题: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教授要去看奥运,但是他舍不下他的玩具,于是 ...
随机推荐
- 「日常训练」Jongmah(Codeforces-1110D)
题意 你有n个数字,范围[1, m],你可以选择其中的三个数字构成一个三元组,但是这三个数字必须是连续的或者相同的,每个数字只能用一次,问这n个数字最多构成多少个三元组? 分析 根据官方Editori ...
- APP端测试,常见功能测试点汇总
除去每个产品和版本不同的业务需求以及功能,针对于大多数的APP的共同点和移动设备的特性,本文总结了一些APP功能测试中经常遇见,需要考虑到的测试点以共参考 一.安装和卸载 应用的安装和卸载在任何一款A ...
- PHP版本的讲解
原文地址:http://dev.meettea.com/show-90-1.html 最近发现很多PHP程序员对PHP版本知识了解不是很清楚,其中不乏PHP产品主力开发人员. PHP版本主要分三支:P ...
- 十大经典排序算法总结 (Python)
作业部落:https://www.zybuluo.com/listenviolet/note/1399285 以上链接是自己在作业部落编辑的排序算法总结- Github: https://github ...
- linux下各文件夹的结构说明及用途介绍(转载)
详细介绍文档 转载文章路径 /bin:二进制可执行命令. /dev:设备特殊文件. /etc:系统管理和配置文件. /etc/rc.d:启动的配 置文件和脚本. /home:用户主目录的基点,比如用户 ...
- sqlserver-查阻塞
模拟阻塞: 打开两个窗口: 窗口一: BEGIN TRANSACTION--开始事务 --等待1分钟 WAITFOR DELAY '00:1'; 窗口二: 查询阻塞:(当前被阻塞的进程id,不 ...
- Python爬虫入门(3-4):Urllib库的高级用法
1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它 是一段HTML代码,加 JS.CS ...
- java面向对象的冒泡排序,选择排序和插入排序的比较
这三种排序有俩个过程: 1.比较俩个数据. 2.交换俩个数据或复制其中一项. 这三种排序的时间级别 冒泡排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换 0 ...
- Alpha发布——美工+文案
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2283 一.功能介绍 本团队(可以低头,但没必要)开发的是一款基于腾讯微信 ...
- Ubuntu16.04下 protobuf3.4.0 的安装与卸载
感谢原文作者:https://blog.csdn.net/xiexievv/article/details/47396725 一. 安装 下载protobuf protobuf下载地址:https:/ ...