p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓
縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中. p教授有編號為1.
.n的n
件玩具,第
i件玩具經過壓縮後變成一維長度為ci
.為了方便整理, p教授要求在乙個一維容器中的玩具編號是連續的。同時如果乙個一維容
器中有多個玩具,那麼兩件玩具之間要加入乙個單位長度的填充物,形式地說如果將第i件玩具到第j個玩具放到乙個容器中,那麼容器的長度將為 x=
j−i+
∑k=i
jci
製作容器的費用與容器的長度有關,根據教授研究,如果容器長度為
x , 其製作費用為(x
−l)2
. 其中
l 是乙個常量。p教授不關心容器的數目,他可以製作出任意長度的容器,甚至超過
l. 但他希望費用最小.
第一行輸入兩個整數n,l.接下來n行輸入ci
. 1<=
n<=
50000,1
<=l,
ci<=107
輸出最小費用
543
4214
1
典型的斜率優化dp 令f
[i] 記錄標號為從
1 到
i的玩具全部壓縮好所需要的最小費用, 則可以得到dp遞推式f[
i]=m
ini−
1j=0
(f[j
]+(s
um[i
]−su
m[j]
+i−j
−1−l
)2)
其中sum
[i] 記錄編號從1 到
i的玩具的長度總和.
假設在i
>
j>
k 中, 對於i 有
j比k 優, 則f[
j]+(
sum[
i]−s
um[j
]+i−
j−1−
l)2k]+(
sum[
i]−s
um[k
]+i−
k−1−
l)2化簡得到 (f
[j]+
b[j]
2)−(
f[k]
+b[k
]2)b
[j]−
b[k]
<2∗
a[i]
其中a[
i]=s
um[i
]+1−
l b[
i]=s
um[i
]+i
*hint: 化簡有一定技巧. 一般來說, 化簡得到的結果要把含可以將這個除法式子理解為所謂的斜率, 記為sli 的項移至等號右邊, 不含
i的項移至左邊, 以方便後續運算.
ope(
j,k)
然後用佇列來維護dp. 具體過程如下:
1. 對於隊頭的兩個元素, 假如有sl
ope(
queu
e[he
ad+1
],qu
eue[
head
])>2∗
a[i]
則說明佇列中第二個元素比第乙個優, 隊頭出隊.
2. 此時可以確保隊頭元素是最優解, 用隊頭元素計算出f[
i]的數值
3. 在有了f[
i]的值的情況下, 就可以在隊尾進行維護了. 對於隊尾的兩個元素記為x,
y(x>y)
, 假如有sl
ope(
x,y)
>sl
ope(
i,x)
則說明x 是無用的, 可以出隊. 具體證明如下: (1). 假如sl
ope(
x,y)
>sl
ope(
i,x)
>2∗
a[i]
, 則雖然有
x 比
i優, 但又有
y 比
x優, 因此
x 可出隊; (2). 假如sl
ope(
x,y)
>sl
ope(
i,x)
<2∗
a[i]
, 則有
i 比
x優,
x 可出隊.
4. 將
i加入隊尾
維護過程結束. 注意每一步的順序, 都是有先後性的, 不要搞反.
然後再說道乙個點, 這一題一定要開lo
nglo
ng感覺現階段推公式的能力還要加強, 這一坨東西我推錯了好多次qaq
附上程式碼
#include
#include
#include
using
namespace
std;
inline
long
long read()
const
long
long n = 1
<< 16;
long
long c[n];
long
long sum[n];
long
long a[n], b[n];
long
long
queue[n];
long
long f[n];
inline
long
long sqr(long
long x)
inline
long
double slope(long
long x, long
long y)
int main()
long
long head = 0, tail = 1;
queue[head] = 0;
memset(f, 0, sizeof(f));
for(long
long i = 1; i <= n; i ++)
printf("%lld\n", f[n]);
}
BZOJ1010 玩具裝箱toy
1010 hnoi2008 玩具裝箱toy time limit 1 sec memory limit 162 mb submit 7631 solved 2924 description p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任...
BZOJ1010 玩具裝箱toy
題目鏈結 bzoj1010 題目大意把n 個數分成若干段,從i到 j 分為一段的花費co st i j jk iva l k j i 求最小花費。分析 1.斜率優化dp,dp i min dp j co st j 1 i 2.先把l 1 設f x xk 1 val k x ff x d p x f ...
BZOJ1010 玩具裝箱toy
斜率優化dp。首先比較容易想到 但是很不幸,由上式的可以看出這實際上要用到兩層迴圈,而資料量為50000,如果這樣做,肯定超時,這時候需要斜率優化了。如果遞推式能變成 且單調,則可使用斜率優化。我們將式變形,令 則由此判斷可以使用斜率優化。關鍵的來了 如果我們認為的兩個方案且的方案的方案好則 dp ...