P3195 [HNOI2008]玩具装箱TOY
P3195 [HNOI2008]玩具裝箱TOY
題目描述
P教授要去看奧運(yùn),但是他舍不下他的玩具,于是他決定把所有的玩具運(yùn)到北京。他使用自己的壓縮器進(jìn)行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。P教授有編號(hào)為1...N的N件玩具,第i件玩具經(jīng)過(guò)壓縮后變成一維長(zhǎng)度為Ci.為了方便整理,P教授要求在一個(gè)一維容器中的玩具編號(hào)是連續(xù)的。同時(shí)如果一個(gè)一維容器中有多個(gè)玩具,那么兩件玩具之間要加入一個(gè)單位長(zhǎng)度的填充物,形式地說(shuō)如果將第i件玩具到第j個(gè)玩具放到一個(gè)容器中,那么容器的長(zhǎng)度將為 x=j-i+Sigma(Ck) i<=K<=j 制作容器的費(fèi)用與容器的長(zhǎng)度有關(guān),根據(jù)教授研究,如果容器長(zhǎng)度為x,其制作費(fèi)用為(X-L)^2.其中L是一個(gè)常量。P教授不關(guān)心容器的數(shù)目,他可以制作出任意長(zhǎng)度的容器,甚至超過(guò)L。但他希望費(fèi)用最小.
輸入輸出格式
輸入格式:第一行輸入兩個(gè)整數(shù)N,L.接下來(lái)N行輸入Ci.1<=N<=50000,1<=L,Ci<=10^7
輸出格式:輸出最小費(fèi)用
輸入輸出樣例
輸入樣例#1:? 5 4 3 4 2 1 4 輸出樣例#1:?1
——————————————————————————————————————————————————————————————————————
普通的一維DP很好想,題中給出$x = j - i + \sum\limits_{k=i}^{j}C_k$
考慮$(x-L)^2$可以變成$(j-i+\sum\limits_{k=i}^{j}C_k-L)^2 = ((\sum\limits_{k=i}^{j}C_k+1)-(L+1))^2$
讀入時(shí)直接把C和L都加1
枚舉j表示從j+1到i劃分成一段,時(shí)間是$O(N^2)$,TLE。
$f[i] = min(f[j]+(S_i-S_j-L)^2)$其中$S_i = \sum\limits_{k=1}^{i}C_k$,即C的前綴和
考慮如何對(duì)其進(jìn)行優(yōu)化
$f[i] = min(f[j]+(S_i-S_j-L)^2)$
$f[i] = min(f[j]+(S_i-L)^2-2(S_i-L)S_j+{S_{j}}^{2})$
$f[i] = (S_i-L)^2+min(y_j-k_ix_j)$
其中$x_j = S_j$,$y_j = f_j + {S_j}^2$,$k_i = 2(S_i-L)$
這就像是一個(gè)直線的斜率式
可知$k_i$是單調(diào)遞增的
將$x_j,y_j$映射到坐標(biāo)軸里,畫(huà)一條過(guò)點(diǎn)$(x_j, y_j)$的斜率為$k_i$的直線
$y_j - k_ix_j$是它的截距。要使答案最小,就要使截距最小。
維護(hù)一個(gè)下凸殼(自行百度),可知只有下凸殼上的點(diǎn)組成的直線才有可能成為最優(yōu)解
因?yàn)閤是遞增的,只需考慮如何在右面加一個(gè)點(diǎn)。如果直線是逆時(shí)針旋轉(zhuǎn),斜率變大,截距變小,直接加入
如果是順時(shí)針,刪除前一個(gè)點(diǎn),加入當(dāng)前點(diǎn)。
用單調(diào)隊(duì)列維護(hù)下凸殼。
轉(zhuǎn)載于:https://www.cnblogs.com/hkttg/p/9417466.html
總結(jié)
以上是生活随笔為你收集整理的P3195 [HNOI2008]玩具装箱TOY的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python题整理
- 下一篇: css3布局篇(双飞翼)