[luogu3198] 玩具装箱
题面
最近在搞dp, 发现自己的dp还是太弱了, 做的题比较少, 也有一些东西没学, 这道题算是我独立做的第一道斜率优化dp, 写篇题解纪念一下吧.
dp式比较简单, 就是一个线性的dp, 设\(f[i]\)为将1 ~ i分为若干个集合所花费的最小值, \(c[i]\)为1 ~ i的\(c\)值的前缀和, 对于满足\(j\)小于\(i\)的\(j\), 则有:
\]
设\(a[i] = c[i] + i\), \(b[i] = c[i] + i + 1 + l\), 则可将上式化简为下式:
f[i] = & min(f[j] + (a[i] - b[j])^2)\\
=&min(f[j] + a[i] ^ 2 + b[j] ^ 2 - 2 * a[i] * b[j])
\end{aligned}
\]
假设对于某个\(k\)(\(k\) >\(j\)), 选\(k\)比选\(j\)更优, 则有下式:
f[k] + a[i] ^ 2 + b[k] ^ 2 - 2 * a[i] * b[k] &< f[j] + a[i] ^ 2 + b[j] ^ 2 - 2 * a[i] * b[j]\\
(f[k] + b[k] ^ 2) - (f[j] + b[j] ^ 2) &< 2 * a[i] * (b[k] - b[j])\\
\frac{(f[k] + b[k] ^ 2) - (f[j] + b[j] ^ 2)}{2 * (b[k] - b[j])} &< a[i]
\end{aligned}
\]
对于上述几个不等式, 由于\(c[i]\)与\(i\)单调递增, 所以\(a[i]\)也是单调递增的, 那么对于平面上的任意三个决策点\(j_1\), \(j_2\), \(j_3\), 若\(j_2\)对\(i\)最优, 则\((b[j_1], f[j_1] + b[j _ 1] ^ 2)\), \((b[j_2], f[j_2] + b[j _ 2]^2)\), \((b[j_3], f[j _ 3] + b[j _ 3] ^ 2)\)三点应该满足下列两个等式:
\frac{(f[j_2] + b[j_2] ^ 2) - (f[j _ 1] + b[j _ 1] ^ 2)}{2 * (b[j_2] - b[j _ 1])} &< a[i]\\
\frac{(f[j_3] + b[j_3] ^ 2) - (f[j _ 2] + b[j _ 2] ^ 2)}{2 * (b[j_3] - b[j _ 2])} &\geq a[i]\\
\end{aligned}
\]
所以有:
\]
也就是斜率单调上升, 故维护一个下凸包即可, 注意单调队列初始化时要先加入一个0.
代码
#include <iostream>
#include <cstring>
#include <cstdio>
#define N 50005
#define int long long
using namespace std;
int n, L, sum[N], a[N], b[N], f[N], q[N], l = 1, r;
inline int read()
{
int x = 0, w = 1;
char c = getchar();
while(c < '0' || c > '9') { if (c == '-') w = -1; c = getchar(); }
while(c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
return x * w;
}
bool F_check(int x, int y, int z) { return f[y] - f[x] + b[y] * b[y] - b[x] * b[x] < 2 * z * (b[y] - b[x]); }
bool S_check(int x, int y, int z)
{
return (f[y] - f[x] + b[y] * b[y] - b[x] * b[x]) * (b[z] - b[y]) > (f[z] - f[y] + b[z] * b[z] - b[y] * b[y]) * (b[y] - b[x]);
}
signed main()
{
n = read(); L = read();
for(int i = 1; i <= n; i++)
{
sum[i] = read(); sum[i] += sum[i - 1];
a[i] = sum[i] + i; b[i] = sum[i] + i + L + 1;
}
memset(f, 0x3f, sizeof(f));
b[0] = L + 1; f[0] = 0;
q[++r] = 0;
for(int i = 1; i <= n; i++)
{
while(l < r && F_check(q[l], q[l + 1], a[i])) l++;
f[i] = f[q[l]] + a[i] * a[i] + b[q[l]] * b[q[l]] - 2 * a[i] * b[q[l]];
while(l < r && S_check(q[r - 1], q[r], i)) --r;
q[++r] = i;
}
printf("%lld\n", f[n]);
return 0;
}
\\有一些数组的名字改动了一点点, 世上不是缺少不一样的东西, 而是缺少发现不一样的东西的眼睛
你觉得我会告诉你我在写题目之前就把题解写完了吗???
[luogu3198] 玩具装箱的更多相关文章
- 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教授要去看奥运,但是他舍不下他的玩具,于是 ...
- BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP
1010: [HNOI2008]玩具装箱toy Description 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] ...
- 【bzoj1010】[HNOI2008]玩具装箱toy
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9281 Solved: 3719[Submit][St ...
- 【斜率DP】BZOJ 1010:玩具装箱
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 7537 Solved: 2888[Submit][St ...
- BZOJ_1010_[HNOI2008]_玩具装箱toy_(斜率优化动态规划+单调队列)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1010 给出\(n\)和\(l\).有\(n\)个玩具,第\(i\)个玩具的长度是\(c[i]\ ...
- 【BZOJ 1010】 [HNOI2008]玩具装箱toy (斜率优化)
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9330 Solved: 3739 Descriptio ...
随机推荐
- Sql Server分页储存过程
--分页储存过程if exists (select * from sys.procedures where name='Page')drop proc Pagegocreate proc Page@P ...
- 01-MySql的前戏
[转]01-MySql的前戏 MySql的前戏 在学习Mysql之前,我们先来想一下一开始做的登录注册案例,当时我们把用户的信息保存到一个文件中: #用户名 |密码root|123321 alex|1 ...
- python-装饰器模式
源码地址:https://github.com/weilanhanf/PythonDesignPatterns 说明: 有时为了给某个对象而不是给整个类添加一个功能,使用继承机制是添加功能的一个有效途 ...
- 排序算法(2)--Insert Sorting--插入排序[2]--binary insertion sort--折半(二分)插入排序
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.基本思想 二分法插入排序的思想和直接插入一样,只是找合适的插入位置的方式不同,这里是按二分法找到合适的位置,可 ...
- css翻译名词术语
原文 本书译法 其它译法(未采用) CSS - 层叠样式表.级联样式表.样式单 cascade 层叠(机制) 级联 fallback 回退(机制.措施.方案) 后备.回落.降级 selector 选择 ...
- [bug]解决chrome浏览器不支持所有媒体音乐不自动播放问题
声音无法自动播放这个在 IOS/Android 上面一直是个惯例,桌面版的 Safari 在 2017 年的 11 版本也宣布禁掉带有声音的多媒体自动播放功能,紧接着在 2018 年 4 月份发布的 ...
- 【读书笔记】iOS-报刊杂志-Newsstand应用编程
一,使用Newsstand Kit API 苹果公司在iOS5之后提供了电子报刊杂志开发API-Newsstand Kit.Newsstand Kit 只有3个类:NKLibrary,NKIssue和 ...
- Python 基于Python实现邮件发送
基于Python实现邮件发送 by:授客 QQ:1033553122 测试环境: Python版本:Python 2.7 注:需要修改mimetypes.py文件(该文件可通过文章底部的网盘分 ...
- 记一次寻找appbug的问题
公司规模 3000人以上 全国500强. 从总部刚交接过来的代码. 1.找不到代码.代码部分丢失.(由于没有交接,没有任何相关文档,花了一天确定代码丢失.从总部找到部分代码) 2.查找测试库,发现测试 ...
- 获取本地机器的特征码IP MAC
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Ma ...