「HNOI2008」玩具装箱
传送门
Luogu
解题思路
\(\text{DP}\) 很显然:
设 \(dp_i\) 表示前 \(i\) 个玩具的最小费用,转移就是:
\(dp_i = \max\limits_{0\le j < i}\left\{dp_j+(i-j-1+s_i-s_j-L)^2\right\}\)
\(s_i=\sum_{j=1}^ic_j\),但这是 \(O(n^2)\) 的,显然不够优秀,考虑进一步优化。
我们可以化简一下这个式子:
假设 \(dp_i\) 成功从 \(dp_j\) 转移过来,那么就有:
\(dp_i=dp_j+(i-j-1+s_i-s_j-L)^2\)
整理一下式子:
设 \(a_i = s_i+i-L-1,b_i=s_i+i\)
那么就有:
\(dp_i=dp_j+(a_i-b_j)^2\)
展开并移项可得:
\(dp_j+b_j^2=2a_ib_j+dp_i-a_i^2\)
再设 \(x_i=2b_i,y_i=dp_i+b_i^2\)
\(y_j=a_ix_j+dp_i-a_i^2\)
又因为 \(a_i^2\) 是定值,要最小化 \(dp_i\) ,那么就相当于坐标系中一条斜率为 \(a_i\) 的经过点 \((x_j, y_j)\) ,使得它的纵截距最小化。
又因为我们的 \(a_i, b_i\) 都是递增的,显然这些可能的转移点都要在下凸壳上才能使截距最小。
所以我们用单调队列,维护一下凸包上的转移点。
当前最优转移点从队头不断弹出不最优的点,并用最后的合法情况转移 \(dp_i\)。
插入当前的 \(i\) 时,为了确保凸包的性质,先不断从队尾弹出不合法的点,再插入 \(i\)。
最后输出答案 \(dp_n\)。
细节注意事项
- 咕咕咕
参考代码
#include <algorithm>
#include <iostream>
#include <cstdio>
#define rg register
using namespace std;
typedef double db;
const int _ = 50010;
int n, L; db dp[_], s[_], A[_], B[_];
int hd = 1, tl = 1, Q[_];
inline db X(int i) { return (db) B[i]; }
inline db Y(int i) { return (db) dp[i] + B[i] * B[i]; }
inline db slope(int i, int j) { return (db) (Y(j) - Y(i)) / (X(j) - X(i)); }
int main() {
#ifndef ONLINE_JUDGE
freopen("in.in", "r", stdin);
#endif
scanf("%d%d", &n, &L);
for (rg int i = 1; i <= n; ++i) scanf("%lf", s + i), s[i] += s[i - 1];
for (rg int i = 1; i <= n; ++i) A[i] = (db) s[i] + i - L - 1;
for (rg int i = 1; i <= n; ++i) B[i] = (db) s[i] + i;
for (rg int i = 1; i <= n; ++i) {
while (hd < tl && slope(Q[hd], Q[hd + 1]) < 2 * A[i]) ++hd;
dp[i] = dp[Q[hd]] + (A[i] - B[Q[hd]]) * (A[i] - B[Q[hd]]);
while (hd < tl && slope(Q[tl - 1], Q[tl]) > slope(Q[tl - 1], i)) --tl;
Q[++tl] = i;
}
printf("%lld\n", (long long) dp[n]);
return 0;
}
完结撒花 \(qwq\)
「HNOI2008」玩具装箱的更多相关文章
- 【BZOJ1010】【HNOI2008】玩具装箱(斜率优化,动态规划)
[BZOJ1010][HNOI2008]玩具装箱 题面 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一 ...
- 【BZOJ】【1010】【HNOI2008】玩具装箱Toy
DP/斜率优化 根据题目描述很容易列出动规方程:$$ f[i]=min\{ f[j]+(s[i]-s[j]+i-j-1-L)^2 \}$$ 其中 $$s[i]=\sum_{k=1}^{i} c[k] ...
- BZOJ_1010_[HNOI2008]_玩具装箱toy_(斜率优化动态规划+单调队列)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1010 给出\(n\)和\(l\).有\(n\)个玩具,第\(i\)个玩具的长度是\(c[i]\ ...
- 动态规划(斜率优化):BZOJ 1010 【HNOI2008】 玩具装箱
玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8218 Solved: 3233[Submit] Description P 教授要去 ...
- BZOJ 1010 【HNOI2008】 玩具装箱toy
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...
- 【BZOJ1010】【HNOI2008】玩具装箱
继续看黄学长代码 原题: P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1.. ...
- BZOJ 1010 [HNOI2008]toy 玩具装箱
2017.6.9:经过我的不懈努力,终于把此题A掉了,但上凸和下凸总是那么让人费解…… P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意 ...
- 【HNOI2008】玩具装箱TOY & 斜率优化学习笔记
题目 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为 \(1\cdots N\ ...
- 【HNOI2008】玩具装箱
P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具 ...
随机推荐
- twisted task.cpperator
twisted task.cpperator 1. twisted task.cpperator 1.1. 简介-cooperator 官方文档: https://twistedmat ...
- ES6-let声明变量
在es6中除了var还可以用let申明变量,并且建议使用let而不要再使用var,两者有以下区别: 1.let不能重复声明变量 var name = 'tom'; var name = 'jack'; ...
- 树莓派Ubuntu Mate 16.04 修改为国内更新源
收藏:https://blog.csdn.net/wang_shuai_ww/article/details/80386708 更换步骤以root身份打开 /etc/apt/sources.list ...
- 吴裕雄 python 神经网络——TensorFlow 滑动平均类的保存
import tensorflow as tf v = tf.Variable(0, dtype=tf.float32, name="v") for variables in tf ...
- XCOJ 1205 A.First Blood
1205: A.First Blood 时间限制: 1 Sec 内存限制: 64 MB提交: 152 解决: 44 标签提交统计讨论版 题目描述 盖伦是个小学一年级的学生,在一次数学课的时候,老师 ...
- python实现队列(queue)
队列队列是一种先进先出的数据结构,主要操作包括入队,出队.入队的元素加入到对尾,从队头取出出队的元素.这里用列表简单模拟队列,其实现如下: queue()is_empty()size()enqueue ...
- redis几种数据导出导入方式
一.redis-dump方式 1.安装redis-dump工具 [root@172.20.0.3 ~]# yum install ruby rubygems ruby-devel -y 更改gem源 ...
- 15、python面对对象之类和对象
前言:本文主要介绍python面对对象中的类和对象,包括类和对象的概念.类的定义.类属性.实例属性及实例方法等. 一.类和对象的概念 问题:什么是类?什么是实例对象? 类:是一类事物的抽象概念,不是真 ...
- Kubernetes集群部署及简单命令行操作
三个阶段部署docker:https://www.cnblogs.com/rdchenxi/p/10381631.html 环境准备 [root@master ~]# hostnamectl set- ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:显示在 <abbr> 元素中的文本以小号字体展示,且可以将小写字母转换为大写字母
<!DOCTYPE html> <html> <head> <title>菜鸟教程(runoob.com)</title> <meta ...