P3195玩具装箱,斜率优化

P3195玩具装箱,斜率优化

题面:

[HNOI2008] 玩具装箱

题目描述

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

P 教授有编号为 1 ⋯ n 1 \cdots n 1n n n n 件玩具,第 i i i 件玩具经过压缩后的一维长度为 C i C_i Ci

为了方便整理,P教授要求:

  • 在一个一维容器中的玩具编号是连续的。

  • 同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物。形式地说,如果将第 i i i 件玩具到第 j j j 个玩具放到一个容器中,那么容器的长度将为 x = j − i + ∑ k = i j C k x=j-i+\sum\limits_{k=i}^{j}C_k x=ji+k=ijCk

制作容器的费用与容器的长度有关,根据教授研究,如果容器长度为 x x x,其制作费用为 ( x − L ) 2 (x-L)^2 (xL)2。其中 L L L 是一个常量。P 教授不关心容器的数目,他可以制作出任意长度的容器,甚至超过 L L L。但他希望所有容器的总费用最小。

输入格式

第一行有两个整数,用一个空格隔开,分别代表 n n n L L L

2 2 2 到 第 ( n + 1 ) (n + 1) (n+1) 行,每行一个整数,第 ( i + 1 ) (i + 1) (i+1) 行的整数代表第 i i i 件玩具的长度 C i C_i Ci

输出格式

输出一行一个整数,代表所有容器的总费用最小是多少。

样例 #1

样例输入 #1

5 4
3
4
2
1
4

样例输出 #1

1

提示

对于全部的测试点, 1 ≤ n ≤ 5 × 1 0 4 1 \leq n \leq 5 \times 10^4 1n5×104 1 ≤ L ≤ 1 0 7 1 \leq L \leq 10^7 1L107 1 ≤ C i ≤ 1 0 7 1 \leq C_i \leq 10^7 1Ci107

Solution:

暴力dp:

观察性质,我们可以很容易的列出一个 d p dp dp状态, f i f_i fi表示我们已经装好了前i个玩具所花费的最小代价

对于这个转移方程,我们可以很容易的发现一个 d p dp dp式子,就是我们去枚举一个 j j j,满足条件 j ∈ [ 1 , i ] j\in[1,i] j[1,i]表示我们把 j ∼ i j\sim i ji的玩具装到了一个箱子里面,那么我们显然有一个方程为 f i = m i n ( f j + ( S i + i − ( S j + j ) − 1 − L ) 2 ) f_i=min(f_j + (S_i+i-(S_j+j)-1-L)^2) fi=min(fj+(Si+i(Sj+j)1L)2),其中 S i S_i Si表示 ∑ k = 1 i C k \sum_{k=1}^iC_k k=1iCk,也就是维护了一个前缀和,这样我们发现,我们每次转移是 Θ ( n ) \Theta(n) Θ(n)的,所以我们的复杂度为 Θ ( n 2 ) \Theta(n^2) Θ(n2),这样显然是我们不可接受的.

斜率优化:

我们把 f i = m i n ( f j + ( S i + i − ( S j + j ) − 1 − L ) 2 ) f_i=min(f_j + (S_i+i-(S_j+j)-1-L)^2) fi=min(fj+(Si+i(Sj+j)1L)2)中的 S i + i S_i+i Si+i设为 g i g_i gi,将 S j + j S_j+j Sj+j设为 g j g_j gj那么我们会得到一个式子就是 f i = m i n ( f j + ( g i − g j − 1 − L ) 2 ) f_i=min(f_j + (g_i-g_j-1-L)^2) fi=min(fj+(gigj1L)2),之后我们 ∀ j 1 , j 2 ∈ [ 1 , i ] \forall j_1,j_2\in[1,i] j1,j2[1,i]并且我们假设 j 1 j_1 j1要比 j 2 j_2 j2更优,那我们就有式子 f j 1 + ( g i − g j 1 − 1 − L ) 2 > = f j 2 + ( g i − g j 2 − l − L ) 2 f_{j_1}+(g_i-g_{j_1}-1-L)^2>=f_{j_2}+(g_i-g_{j_2}-l-L)^2 fj1+(gigj11L)2>=fj2+(gigj2lL)2,我们将这个式子展开化简一下, 设 p j 1 = g j 1 − 1 − L 设p_{j_1}=g_{j_1}-1-L pj1=gj11L, j 2 j_2 j2同理,然后我们把有 i i i的算式移到左边,最后我们会得到一个不等式 g i > = ( f j 2 + p j 2 2 − f j 1 + p j 1 2 ) 2 g j 2 − 2 g j 1 g_i>=\frac{(f_{j_2}+p_{j_2}^2-f_{j_1}+p_{j_1}^2)}{2g_{j_2}-2g_{j_1}} gi>=2gj22gj1(fj2+pj22fj1+pj12),我们观察这个式子,我们可以发现一些很奇妙的东西,我们令 f j 2 − p j 2 2 = y 2 , f j 1 + p j 1 2 = y 1 f_{j_2}-p_{j_2}^2=y_2,f_{j_1}+p_{j_1}^2=y_1 fj2pj22=y2,fj1+pj12=y1,再令 2 g j 2 = x 2 , 2 g j 1 = x 1 2g_{j_2}=x_2,2g_{j_1}=x_1 2gj2=x2,2gj1=x1,我们替换一下,会发现原式子变成了 g i > = y 2 − y 1 x 2 − x 1 g_i>=\frac{y_2-y_1}{x_2-x_1} gi>=x2x1y2y1,这不就是点斜式嘛!!!,然后我们发现,我们 j 1 , j 2 j_1,j_2 j1,j2两个决策点,有且仅当满足上述不等式时 j 1 j_1 j1要更优,所以我们不妨把这些多项式转换成一些点,如下图:

其中两个点分别为我们 j 1 , j 2 j_1,j_2 j1,j2 ,红色的线为我们两点之间的斜率,绿色的线为我们 g i g_i gi的斜率,我们发现当且当绿色的线的斜率大于红色的线的斜率时, j 1 j_1 j1才会最优,相反的若绿色的线的斜率小于红色的线的斜率时, j 2 j_2 j2更优,所以我们现在来证明一种特殊情况,如下图:

我们要证明的是,中间的点一定不优,为什么呢,我们发现这是一个上凸包,我们如果想中间的点更优,则需满足 B C BC BC的斜率要小于 g i g_i gi的斜率, A B AB AB的斜率要小于 g i g_i gi的斜率,这是完全矛盾的,所以我们对于每一个上凸包,中间的点一定不能构成答案,所以我们把中间的点删去后,我们最后得到的图一定是斜率单调上升的。

我们有了上述条件之后,我们如何去找最优决策点呢?

我们发现,我们最后得到的图像一定是下凸包,如下图:

我们发现,如果我们能找到一个下凸包的切点与 g i g_i gi的斜率恰好重合的点,那么这个点必定是最优决策点,为什么呢?

因为我们发现,若最优决策点在中间的点右边,其斜率是单调递增的,所以后面的斜率一定都是大于 g i g_i gi的斜率的,再看左边,我们发现其左边都是小于 g i g_i gi的斜率的,所以肯定不能构成答案,证毕,所以我们只需要用单调队列去维护这种下凸包即可,时间复杂度 Θ ( n ) \Theta(n) Θ(n).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值