复习一下斜率优化:
令 $f_{i}$ 表示从 1 考虑到 $i$ 的最优结果.
得 $f_{i}=min${ $f_{j}+(sum_{i}-sum_{j}+i-j-1-L)^{2}$}
如果直接枚举,是 $O(n^{2})$ 的,太慢了!!!
考虑斜率优化:
令 $k<j$,考虑什么时候 $j$ 比 $k$ 优:
$fj​+(sumi​−sumj​+i−j−1−L)^{2}<fk​+(sumi​−sumk​+i−k−1−L)^{2}$
令 $a_{i}=sum_{i}+i$ ,$b_{i}=sum_{i}+i+1+L$ (为了简化计算)
得: $f_{j}+(a_{i}-b_{j})^{2}<f_{k}+(a_{i}-b_{k})^{2}$
化简一下,得:$\frac{f_{j}+b_{j}^{2}-(f_{k}+b_{k}^{2})}{b_{j}-b_{k}}<2\times a_{i}$
令 $g[x]=f_{x}+b_{x}^{2}$
上面式子为 $\frac{g_{j}-g_{k}}{b_{j}-b{k}}$,看上去是不是很熟悉 ?
这不就是一次函数斜率得形式嘛......
可以把 $j,k$ 都看作二维平面上的点 $(b_{j},g_{j})$ 与 $(b_{k},g_{k})$
那么, $j$ 的答案优于 $k$ 是在二者得斜率小于 $2\times a_{i}$ 的情况下成立的.
所以说,我们要求的 $j$ 就是编号最大的与前一个点的斜率小于 $2a_{i}$ 的值. 
手画一下,发现这道题中我们要维护的其实就是一个下凸包.
根据我们每一次的斜率 $2\times a_{i}$,不难发现这个东西是单调递增的,所以当我们找到答案 $tmp$ 时,$tmp$ 前的所有点就都变成无用点,直接弹掉即可.
而每一次新加入一个点,就顺便维护凸包的形状,将不合法的点从队尾弹出即可.     
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 100000 + 123;
long long s[maxn], f[maxn];
int l, n, q[maxn];
inline long long re_x(int i){ return s[i]; }
inline long long re_y(int i){ return f[i] + (s[i] + l) * (s[i] + l); }
inline double get_slope(int i,int j){return (double)(re_y(i) - re_y(j)) / (re_x(i) - re_x(j)); }
int main()
{
scanf("%d%d",&n,&l);
for(int i = 1;i <= n; ++i) scanf("%lld",&s[i]), s[i] += s[i-1];
for(int i = 1;i <= n; ++i) s[i] += i;
int head = 0, tail = 0;
for(int i = 1;i <= n; ++i)
{
while(head < tail && get_slope(q[head], q[head + 1]) < 2 * s[i] ) ++ head;
f[i] = f[q[head]] + (s[i] - s[q[head]] - 1 - l) * (s[i] - s[q[head]] - 1 - l);
while(tail > head && get_slope(q[tail], i) < get_slope(i, q[tail - 1])) --tail;
q[++tail] = i;
}
printf("%lld",f[n]);
return 0;
}

  

洛谷P3195 [HNOI2008]玩具装箱TOY 斜率优化的更多相关文章

  1. 洛谷P3195 [HNOI2008]玩具装箱TOY——斜率优化DP

    题目:https://www.luogu.org/problemnew/show/P3195 第一次用斜率优化...其实还是有点云里雾里的: 网上的题解都很详细,我的理解就是通过把式子变形,假定一个最 ...

  2. [洛谷P3195][HNOI2008]玩具装箱TOY

    题目大意:有n个物体,大小为$c_i$.把第i个到第j个放到一起,容器的长度为$x=j-i+\sum\limits_{k-i}^{j} c_k$,若长度为x,费用为$(x-L)^2$.费用最小. 题解 ...

  3. 洛谷 P3195 [HNOI2008]玩具装箱TOY

    题意简述 有n个物体,第i个长度为ci 将n个物体分为若干组,每组必须连续 如果把i到j的物品分到一组,则该组长度为 \( j - i + \sum\limits_{k = i}^{j}ck \) 求 ...

  4. P3195 [HNOI2008]玩具装箱TOY 斜率优化dp

    传送门:https://www.luogu.org/problem/P3195 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任 ...

  5. 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)

    题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...

  6. 斜率优化dp学习笔记 洛谷P3915[HNOI2008]玩具装箱toy

    本文为原创??? 作者写这篇文章的时候刚刚初一毕业…… 如有错误请各位大佬指正 从例题入手 洛谷P3915[HNOI2008]玩具装箱toy Step0:读题 Q:暴力? 如果您学习过dp 不难推出d ...

  7. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP

    1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...

  8. bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 11893  Solved: 5061[Submit][S ...

  9. Bzoj 1010: [HNOI2008]玩具装箱toy(斜率优化)

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MB Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定 ...

随机推荐

  1. lunix下的redis数据库操作——set集合

    创建:(集合的特点是:有序,无重复) sadd set 1 2 3 4 5 6 查看: smembers set 删除元素: srem set 3 # 还剩 1 2 4 5 6 移动: sadd se ...

  2. java反射意义

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...

  3. Android 删除新版安卓fragment_main.xml

    在新版本号的ADT中,创建androidproject时默认会产生两个xml文件--fragment_main和activity_main. 个人建议把fragment_main这个文件删除掉 1)将 ...

  4. shell学习五十天----查看进程ps命令

    进程列表 列出进程中最重要的命令便是进程状态命令:ps. ps命令是进程状态(Process Status)的缩写.ps命令用来列出系统中当前执行的那些进程.ps命令列出的是当前那些进程的快照,就是执 ...

  5. poj--1274--The Perfect Stall(最大匹配)

    The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21665   Accepted: 973 ...

  6. (Go)03.go类型

    1.1 变量Go 是静态类型语⾔言,不能在运⾏行期改变变量类型.使⽤用关键字 var 定义变量,⾃自动初始化为零值.如果提供初始化值,可省略变量类型,由编译器⾃自动推断. var x int var ...

  7. SwiftUI 官方教程(八)

    8. 动态生成预览 接下来,我们会在 LandmarkList_Previews 中添加代码以在不同的设备尺寸上渲染列表.默认情况下,预览会以当前的 scheme 中设备的大小进行渲染.我们可以通过调 ...

  8. mac下安装tesseract-OCR(Mac下还是有lib依赖的问题,有时间再解决)

    1.先下载需要的软件包 OCR工具:  Tesseract-OCR3.0.1  source code    tesseract-ocr-3.01.eng.tar.gz 破验证码用英文就够了. 图像处 ...

  9. Android线程间异步通信机制源码分析

    本文首先从整体架构分析了Android整个线程间消息传递机制,然后从源码角度介绍了各个组件的作用和完成的任务.文中并未对基础概念进行介绍,关于threadLacal和垃圾回收等等机制请自行研究. 基础 ...

  10. [ Tools ] [ MobaXterm ] [ SSH ] [ Linux ] export and import saved session

    How to export MobaXterm sessions to another computer? https://superuser.com/questions/858973/how-to- ...