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