BZOJ1010_玩具装箱toy_KEY
这道题可以很快想到暴力DP的做法:
f[i]=min(f[i],f[j]+(C[i]-C[j]+i-j--L)^);
但是数据范围有50000,这就需要用斜率优化了。
我们设S[i]=C[i]+i(C[i]为前缀和),L++,设j为i的最优决策点。。
原方程就变为:
f[i]=f[j]+(S[i]-(S[j]-L))^;
f[i]=f[j]+S[i]^2+(S[j]-L)^2-2*S[i]*(S[j]-L);
f[j]+S[i]^2+(S[j]-L)^2=2*S[i]*(S[j]-L)+f[i];
y = k x + b
我们设2*S[i]为k。
相当于这题就变成了求最小的截距f[i]。

假设A,B,C,D为四个决策点。
因为AB的斜率小于f的斜率(2*S[i]),所以它对当前状态的转移一定是没用的。
因为如果要进过A点转移,需要将f"抬高"很多,会大大增大它的截距(f[i])。
所以斜率小于f(当前点)都可以排除。
所以B为最优决策点。
通过B点转移后,如图:

而对于这个New点,它对于之后的点,比D点更优,因为在之后转移时,CNew比CD的斜率更小,所得截距也最小。(由于f的斜率是单调递增的)
这个在凸包上的操作通过单调队列实现。
code:
#include <cstdio>
using namespace std; int read()
{
char c;while(c=getchar(),c<''||c>'');
int x=c-'';while(c=getchar(),c>=''&&c<='')x=x*+c-'';
return x;
} typedef long long LL;
LL N,L,f[],a[];
LL sum[],S[];
LL l[],h,t; double X(int x){return S[x];}
double Y(int y){return f[y]+(S[y]+L-)*(S[y]+L-);}
double get(int x,int y){
return (Y(y)-Y(x))/(X(y)-X(x));
} int main()
{
N=read(),L=read();L++;
register int i;
for(i=;i<=N;i++)a[i]=read();
for(i=;i<=N;i++){
sum[i]=sum[i-]+a[i];
S[i]=sum[i]+i;
}
h=t=;
for(i=;i<=N;i++){
while(h<t&&get(l[h],l[h+])<*S[i])h++;
f[i]=f[l[h]]+(S[i]-S[l[h]]-L)*(S[i]-S[l[h]]-L);
while(h<t&&get(l[t-],l[t])>get(l[t],i))t--;
l[++t]=i;
}
printf("%lld",f[N]);
return ;
}
BZOJ1010_玩具装箱toy_KEY的更多相关文章
- 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 ...
随机推荐
- nd.array.where
http://mxnet.apache.org/api/python/ndarray/ndarray.html#mxnet.ndarray.where Return the elements, eit ...
- showDoc项目文档管理工具
1:下载showdoc代码文件 https://github.com/star7th/showdoc https://www.showdoc.cc/help?page_id=14 官方帮助文档 2:安 ...
- 笔试面试之C++
7 类B是类A的公有派生类, 类A和类B中都定义了虚函数func(), p 是一个指向类A对象的指针,则p->A::func()将() A 调用类A中的函数 B 调用类B中的函数 C 根据p所指 ...
- 随手练——S(n)=O(1),判断一个链表是否为“回文”
方法一:T(n)=O(n),S(n)=O(n) 走完一遍链表,每个值入栈,之后再走一遍链表,和每次弹出的栈顶进行比较. 核心: LNode *p = l->next; while (p) { s ...
- Monkeyrunner命令
1.使用Monkeyrunner脚本命令时,需要导入模块才能使用模块的脚本命令,Monkeyrunner的常用模块有 MonkeyRunner,MonkeyDevice,MonkeyImage,Mon ...
- ant design 修改tab样式
.ant-tabs-ink-bar{ background-color: transparent !important; } .ant-tabs-top .ant-tabs-ink-bar-anima ...
- 封装dialog弹框
<!DOCTYPE html> <html lang="en"> <head> <meta name="viewport&quo ...
- Tomcat 安装APR的有关问题
Tomcat 安装APR的问题APR.APR-util.APR-iconv安装都正常apr安装命令:./configuremakemake install apr-util./configure -- ...
- Java中的集合框架-Collection(一)
一,Collection接口 在日常的开发工作中,我们经常使用数组,但是数组是有很多的局限性的,比如:数组大小固定后不可修改,只能存储基本类型的值等等. 基于数组的这些局限性,Java框架就产生了用于 ...
- iOS笔记,开发经验总结【持续更新】
1. 设置navigationBar 背景颜色有色差, 原因:如果单纯的设置背景颜色也是有高斯模糊处理的效果,对纯色高斯模糊处理过后相当于纯色的70%(猜测)透明化处理,但是反正就是有色差 解决方法一 ...