bzoj1010 玩具装箱
玩具装箱
P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的。同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器的长度将为 x=j-i+1+Sigma(Ck) i<=K<=j 制作容器的费用与容器的长度有关,根据教授研究,如果容器长度为x,其制作费用为(X-L)^2.其中L是一个常量。P教授不关心容器的数目,他可以制作出任意长度的容器,甚至超过L。但他希望费用最小。
首先普通dp得方程\(dp[i]=min(dp_j+(i-j-1+a_i-a_j-l)^2)\),发现有\(a_i*a_j\)的项,于是考虑斜率优化。为了简化方程,用斜率优化的套路,把只与同一下标相关的项统一起来。令\(b_i=a_i+i\),\(d_i=b_i-l-1\),那么\(dp[i]=min(dp[j]+(d_i-b_j)^2)\)。若j优于k,说明\(dp[j]-dp[k]+b_j^2-b_k^2<2d_ib_i-2d_ib_k\),再简化运算,令\(x_i=2b_i\),\(y_i=dp[i]+b_i^2\),那么知道若j优于k,\(\frac{y_j-y_k}{x_j-x_k}<d_i\),也就是可以用斜率优化,单调队列维护下凸包做。
注意此题不存在\(c_i\)等于0,所以可以直接算斜率,不用再乘开计算。这个和hdu那道入门题不同。
#include <cstdio>
using namespace std;
typedef long long LL;
const LL maxn=5e5+5;
LL n, l, h, t, sum[maxn], b[maxn], d[maxn];
LL dp[maxn], x[maxn], y[maxn], q[maxn];
inline LL sqr(LL x){ return x*x; }
int main(){
scanf("%lld%lld", &n, &l);
for (LL i=1; i<=n; ++i){
scanf("%lld", &sum[i]);
sum[i]+=sum[i-1];
}
h=t=0;
for (LL i=1; i<=n; ++i){
b[i]=sum[i]+i, d[i]=b[i]-l-1;
while (h<t&&y[q[h+1]]-y[q[h]]
<d[i]*(x[q[h+1]]-x[q[h]])) ++h;
dp[i]=dp[q[h]]+sqr(d[i]-b[q[h]]);
x[i]=2*b[i], y[i]=dp[i]+sqr(b[i]);
while (h<t&&(y[i]-y[q[t]])*(x[q[t]]-x[q[t-1]])
<(x[i]-x[q[t]])*(y[q[t]]-y[q[t-1]])) --t;
q[++t]=i;
}
printf("%lld\n", dp[n]);
return 0;
}
bzoj1010 玩具装箱的更多相关文章
- [BZOJ1010]玩具装箱toy(斜率优化)
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...
- BZOJ1010玩具装箱 - 斜率优化dp
传送门 题目分析: 设\(f[i]\)表示装前i个玩具的花费. 列出转移方程:\[f[i] = max\{f[j] + ((i - (j + 1)) + sum[i] - sum[j] - L))^2 ...
- luogu3195/bzoj1010 玩具装箱(斜率优化dp)
推出来式子然后斜率优化水过去就完事了 #include<cstdio> #include<cstring> #include<algorithm> #include ...
- BZOJ-1010 玩具装箱toy (斜率优化)
题目大意:将n个数分成若干组,并且每组的数在原数组中应是连续的,每组会产生的代价为sum(i)-sum(j)+i-j-1-m,m为已知的常数.求最小代价. 题目分析:定义dp(i)表示将前 i 个元素 ...
- 【BZOJ1010】【HNOI2008】玩具装箱(斜率优化,动态规划)
[BZOJ1010][HNOI2008]玩具装箱 题面 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一 ...
- [bzoj1010][HNOI2008]玩具装箱toy_斜率优化dp
玩具装箱toy bzoj-1010 HNOI-2008 题目大意:P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一 ...
- 【BZOJ-1010】玩具装箱toy DP + 斜率优化
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8432 Solved: 3338[Submit][St ...
- 【bzoj1010】[HNOI2008]玩具装箱toy
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9281 Solved: 3719[Submit][St ...
- bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 11893 Solved: 5061[Submit][S ...
随机推荐
- es6的foreach循环遍历
forEach forEach是Array新方法中最基本的一个,就是遍历,循环.例如下面这个例子: 结果: 这段代码相当于: for (var k = 0, length = array.length ...
- 把自定义的decoder加入ffmpeg源码
第一步: 在libavcodec目录下新建mkdecoder.c,并加入一下代码: /* *实现一个自己的decoder,编码工作其实就是把pkt的数据拷贝到frame *作者:缪国凯(MK) *82 ...
- Wannafly #4 F 线路规划
数据范围252501 劲啊 Q国的监察院是一个神秘的组织. 这个组织掌握了整个Q国的地下力量,监察着Q国的每一个人. 监察院一共有N个成员,每一个成员都有且仅有1个直接上司,而他只听从其上直接司的命令 ...
- C#如何对DataTable中的数据进行条件搜索
经常遇到将数据库中的数据读取到DataTable中的时候再次对DataTable进行条件筛选,下面的筛选的一个例子: DataRow[] dr = dt.Select("token = '& ...
- 关于日志类Log4j的使用
log4j 的配置 #下面定义日志输出级别是 INFO,并且配置了2个输出目的地,一个是A3,一个是console log4j.rootLogger = INFO,A3,CONSOLE #日志最低的输 ...
- netty中的ByteBuf
网络数据的基本单位总是字节.Java NIO 提供了 ByteBuffer 作为它 的字节容器,但是这个类使用起来过于复杂,而且也有些繁琐. Netty 的 ByteBuffer 替代品是 ByteB ...
- 查看,检查,修复pg的命令
标签(空格分隔): ceph,ceph运维,pg 如果集群状态是HEALTH_ERR 并且有pgs inconsistent,需要进行如下操作: 1. 通过下面的命令查看哪些pg状态不一致: # ce ...
- javascript之系统对话框
浏览器通过alert(),confirm()和prompt()方法调用系统对话框,向用户显示信息. alert()接受一个字符串并显示给用户,结果是显示一个对话框,其中包括指定的文本和一个OK(“确定 ...
- MySQL绿色版的安装步骤
由于工作需要最近要开始研究MySQL了(看来学习都是逼出来的),本人对mysql没有研究,可以说一个小白. 下面就从安装开始吧,虽然网上关于这方面的东西很多,还是需要自己把操作过程写下来. 1.数据库 ...
- Flask15 远程开发环境搭建、安装虚拟机、导入镜像文件、创建开发环境、pycharm和远程开发环境协同工作
1 安装VM虚拟机 待更新... 2 导入镜像文件 待更新... 3 启动虚拟机 4 远程连接虚拟机 4.1 安装xShell软件 待更新... 4.2 创建一个新的连接 4.2.1 在虚拟机中获取虚 ...