P3195 [HNOI2008]玩具装箱TOY(斜率优化dp)
设前缀和为$s[i]$
那么显然可以得出方程
$f[i]=f[j]+(s[i]-s[j]+i-j-L-1)^{2}$
换下顺序
$f[i]=f[j]+(s[i]+i-(s[j]+j+L+1))^{2}$
为了处理方便,我们套路地设
$a[i]=s[i]+i$
$b[i]=s[i]+i+L+1$
于是得出
$f[i]=f[j]+(a[i]-b[j])^{2}$
拆开:$f[i]=f[j]+a[i]^{2}-2*a[i]*b[j]+b[j]^{2}$
移项:$f[j]+b[j]^{2}=2*a[i]*b[j]+f[i]-a[i]^2$
于是我们就把不变量和变量分开了($i$固定)
仔细观察
$f[j]+b[j]^{2}=2*a[i]*b[j]+f[i]-a[i]^2$
$y=k*x+b$
一次函数!
$y=f[j]+b[j]^{2}$
$k=2*a[i]$($i$递增时,显然它是单调递增的)
$x=b[j]$
$b=f[i]-a[i]^{2}$
如果我们要让$f[i]$最小,就是让$b$最小
而对于每个$i$,$k$是不变的
那么问题就转化成:找到一个最优的$(x,y)$使$b$最小
考虑到$k$是单调递增的
于是我们就可以快乐地用单调队列维护下凸包辣
while(L<R&&K(h[L],h[L+])<=*a(i)) ++L;//显然h[L]不比h[L+1]优,可以删去
f[i]=f[h[L]]+(a(i)-b(h[L]))*(a(i)-b(h[L]));//计算出最优的f[i]
while(L<R&&K(h[R-],h[R])>K(h[R],i)) --R;//加入点(x[i],y[i])后,h[R]在凸包内部,可以删去①
h[++R]=i;//入队
①:显然在加入橙点后,蓝点在凸包内部,可以被删除

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef double db;
#define N 50005
db f[N],s[N];
int n,l,L,R,h[N];
inline db a(int x){return s[x]+x;}
inline db b(int x){return s[x]+x+l+;}
inline db X(int x){return b(x);}
inline db Y(int x){return f[x]+b(x)*b(x);}
inline db K(int x,int y){return (Y(x)-Y(y))/(X(x)-X(y));}
int main(){
scanf("%d%d",&n,&l);
for(int i=;i<=n;++i) scanf("%lf",&s[i]),s[i]+=s[i-];
L=R=;
for(int i=;i<=n;++i){
while(L<R&&K(h[L],h[L+])<=*a(i)) ++L;
f[i]=f[h[L]]+(a(i)-b(h[L]))*(a(i)-b(h[L]));
while(L<R&&K(h[R-],h[R])>K(h[R],i)) --R;
h[++R]=i;
}printf("%.0lf",f[n]);
return ;
}
P3195 [HNOI2008]玩具装箱TOY(斜率优化dp)的更多相关文章
- P3195 [HNOI2008]玩具装箱TOY 斜率优化dp
传送门:https://www.luogu.org/problem/P3195 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任 ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY——斜率优化DP
题目:https://www.luogu.org/problemnew/show/P3195 第一次用斜率优化...其实还是有点云里雾里的: 网上的题解都很详细,我的理解就是通过把式子变形,假定一个最 ...
- BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP
1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...
- bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 11893 Solved: 5061[Submit][S ...
- 【bzoj1010】[HNOI2008]玩具装箱toy 斜率优化dp
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- P3195 [HNOI2008] 玩具装箱(斜率优化DP)
题目链接 设\(d[i]\)为将前 \(i\) 个玩具装入箱中所需得最小费用 容易得到动态转移方程: \[d[i] = min(d[j] + (s[i]-s[j]+i-j-1-L)^2), (j< ...
- [luogu3195 HNOI2008] 玩具装箱TOY (斜率优化dp)
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY 斜率优化
Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 100000 ...
- Bzoj 1010: [HNOI2008]玩具装箱toy(斜率优化)
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MB Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定 ...
- 【BZOJ1010】【HNOI2008】玩具装箱toy (斜率优化DP) 解题报告
题目: 题目在这里 思路与做法: 这题不难想. 首先我们先推出一个普通的dp方程: \(f_i = min \{ f_j+(i-j-1+sum_i-sum_j-L)^2\}\) 然后就推一推式子了: ...
随机推荐
- [原][openstack-pike][controller node][issue-4][horizon] dashboard access too low reasons[dashboard 访问太慢]
本文持续更新... 原因一: 访问dashboard 很慢. 输入了用户名和密码还有project后,一直处于首页状态,等很久才进入(暂且不考虑硬件.硬件暂时假设都满足条件) 首先想到的是memca ...
- java后端实习,从最简单的crud做起
现在就是做ssm框架下的sql语句,主要是select语句,sql语句没什么难的,孰能生巧,趁此机会,把自己的sql基础打扎实,也是一种实习的经验. 1.在子查询中字段的类型不相容怎么办? cast函 ...
- ECharts(中国地图篇)的使用
代码html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <me ...
- python基础类型—集合
一,集合. 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. ...
- css3奇数偶数的伪属性
<style> /*奇数*/ ul li:nth-child(odd){ background-color: green; } /*偶数*/ ul li:nth-child(even){ ...
- 唉,可爱的小朋友---(DFS)
唉,小朋友是比较麻烦的.在一个幼儿园里,老师要上一节游戏课,有N个小朋友要玩游戏,做游戏时要用小皮球,但是幼儿园里只有M个小皮球,而且有些小朋友不喜欢和一些小朋友在一起玩,而只喜欢和另一些小朋友一起玩 ...
- LomBok插件的使用
LomBok插件的使用 By Zhai 简介: LomBok是一个通过简单注解就可以减少一些冗余代码编写的小工具.例如 @Setter @Getter 用于实例类上该类就不需要写set get 方法. ...
- MySQL数据库报错pymysql.err.InterfaceError: (0, '')
今天入库的时候出现了报错pymysql.err.InterfaceError: (0, ''),经过排查,发现是由于把连接数据库的代码放到了插入函数的外部,导致多线程运行出错 def write_in ...
- 性能优化-YAHOO军规
1.尽可能减少http请求数量 2.使用CDN 3.添加Expire/Cache-Control头 4.启用Gzip压缩 5.将css放在页面最上 6.将script放在页面最下 7.避免在CSS中使 ...
- Java随机字符串:随机数字字符串,工具类
Java中生成随机数,字符串的工具类 1. 调用方法需要传入生成字符串的长度和需要的类型 生成随机数字 生成随机字母字符串 生成随机字符串+数字等 ......... 2. 总共8种类型,具体看工具类 ...