题目描述
P 教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。
P 教授有编号为 1 ⋯ n 1 \cdots n 1⋯n 的 n n n 件玩具,第 i i i 件玩具经过压缩后的一维长度为 C i C_i Ci。
为了方便整理,P教授要求:
在一个一维容器中的玩具编号是连续的。
同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物。形式地说,如果将第 ii 件玩具到第 jj 个玩具放到一个容器中,那么容器的长度将为 x = j − i + ∑ k = i j C k x=j-i+\sum\limits_{k=i}^{j}C_k x=j−i+k=i∑jCk 。
制作容器的费用与容器的长度有关,根据教授研究,如果容器长度为 xx,其制作费用为 ( x − L ) 2 (x-L)^2 (x−L)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
5 4
3
4
2
1
4
输出 #1
1
说明/提示
对于全部的测试点, 1 ≤ n ≤ 5 × 1 0 4 1 \leq n \leq 5 \times 10^4 1≤n≤5×104, 1 ≤ L ≤ 1 0 7 1 \leq L \leq 10^7 1≤L≤107, 1 ≤ C i ≤ 1 0 7 1 \leq C_i \leq 10^7 1≤Ci≤107 。
题解
这题有 O ( n ) O(n) O(n)的斜率优化方法
首先如果这题有
O
(
n
2
)
O(n^2)
O(n2)的部分分的话应该不难想到DP方程:
d
p
[
i
]
=
m
i
n
{
d
p
[
j
]
+
(
s
u
m
[
i
]
+
i
−
s
u
m
[
j
]
−
j
−
L
−
1
)
2
}
dp[i]=min\{dp[j]+(sum[i]+i-sum[j]-j-L-1)^2\}
dp[i]=min{dp[j]+(sum[i]+i−sum[j]−j−L−1)2}
至于斜率优化,还是按老套路来,把 m i n min min去掉然后把关于 j j j的放在右边。。
由于方程中常数过多,直接设 a [ i ] = s u m [ i ] + i , b [ i ] = s u m [ i ] + i + L + 1 a[i]=sum[i]+i,b[i]=sum[i]+i+L+1 a[i]=sum[i]+i,b[i]=sum[i]+i+L+1
所以 2 ∗ a [ i ] ∗ b [ j ] + d p [ i ] − a [ i ] 2 = d p [ j ] + b [ j ] 2 2*a[i]*b[j]+dp[i]-a[i]^2=dp[j]+b[j]^2 2∗a[i]∗b[j]+dp[i]−a[i]2=dp[j]+b[j]2
b [ j ] b[j] b[j]是 x x x, d p [ j ] + b [ j ] 2 dp[j]+b[j]^2 dp[j]+b[j]2是 y y y, 2 ∗ a [ i ] 2*a[i] 2∗a[i]是斜率, d p [ i ] − a [ i ] 2 dp[i]-a[i]^2 dp[i]−a[i]2是截距。
由于 a a a和 b b b数组都是单调的,所以直接双指针扫一遍即可。