BZOJ1010玩具裝箱Toy

2021-07-26 11:24:52 字數 3179 閱讀 3784

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: 化簡有一定技巧. 一般來說, 化簡得到的結果要把含

i 的項移至等號右邊, 不含

i的項移至左邊, 以方便後續運算.

可以將這個除法式子理解為所謂的斜率, 記為sl

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 ...