P3195 [HNOI2008]玩具装箱TOY

设前缀和为$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)的更多相关文章

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

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

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

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

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

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

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

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

  5. 【bzoj1010】[HNOI2008]玩具装箱toy 斜率优化dp

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

  6. P3195 [HNOI2008] 玩具装箱(斜率优化DP)

    题目链接 设\(d[i]\)为将前 \(i\) 个玩具装入箱中所需得最小费用 容易得到动态转移方程: \[d[i] = min(d[j] + (s[i]-s[j]+i-j-1-L)^2), (j< ...

  7. [luogu3195 HNOI2008] 玩具装箱TOY (斜率优化dp)

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

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

    Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 100000 ...

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

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

  10. 【BZOJ1010】【HNOI2008】玩具装箱toy (斜率优化DP) 解题报告

    题目: 题目在这里 思路与做法: 这题不难想. 首先我们先推出一个普通的dp方程: \(f_i = min \{ f_j+(i-j-1+sum_i-sum_j-L)^2\}\) 然后就推一推式子了: ...

随机推荐

  1. http://www.rehack.cn/techshare/webbe/php/3391.html

    首先配置好本地PHPstudy环境: 默认在D:\phpStudy\php\php-7.0.12-nts\ext目录下有php_pdo_sqlsrv_7_nts_x86.dll.php_sqlsrv_ ...

  2. cf 1110 D

    哇真难啊,没注意到 可以开 dp[N][3][3]这种性质,也就是三个相同的顺子可以变成三个刻子,所以我们维护顺子的数目就不用超过三了,又因为每张牌i,只会被i-1,i-2,影响,所以额外开两维记录( ...

  3. Nest js 使用axios模块

    文档 let r = await this.http.get(`https://api.github.com/users/januwA`).toPromise().then(v => v.dat ...

  4. electron+react

    yarn create react-app electron-react cd electron-react yarn run eject // 修改react-app打包的路径 / -> ./ ...

  5. 16 css实现模糊背景

    --------------------- 本文来自 csu_zipple 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/csu_passer/article/det ...

  6. Trait基础

    Trait基础 在Scala中,Trait是一种特殊概念.首先,Trait可以被作为接口来使用,此时Trait与Java的接口非常类似.同时在Trait可以定义抽象方法,其与抽象类中的抽象方法一样,不 ...

  7. vim 命令补充(1)

    本篇文章主要教你如何使用 Vim 分屏功能. 分屏启动Vim 使用大写的O参数来垂直分屏. vim -On file1 file2 ... 使用小写的o参数来水平分屏. vim -on file1 f ...

  8. Unity 为队伍设置不同颜色的shader

    在魔兽争霸等一些游戏中,我们通过模型的颜色就能很轻松的区分队伍,如下:   实现的方法有很多,比如: 1,为不同队伍各出一张不同颜色的贴图(Hmmm,war3有的地图可以容纳12只队伍,美术大大们会很 ...

  9. python语法_终止循环_break_continue

    break 终止整个循环计算 continue 终止本次循环,continue前的代码执行,continue后的代码不执行,下次循环继续.

  10. 2018今日头条杯 E-Jump a Jump

    Problem E. Jump A JumpInput file: standard inputOutput file: standard outputTime limit: 1 secondsMemor ...