dp on 凸殼總結&gym 101806 T Touch The Sky 題解
dp on 凸殼總結&gym 101806 T Touch The Sky 題解
我也不知道這個玩意究竟叫什麼。。。。
對於這樣的dp問題:
d p i , j = min ( d p i − 1 , j , d p i − 1 , j − 1 + w i ) dp_{i,j}=\min (dp_{i-1,j},dp_{i-1,j-1}+w_i) dpi,j=min(dpi−1,j,dpi−1,j−1+wi),(for example :Touch The Sky)
求任意的 d p i , j dp_{i,j} dpi,j。
可以發現 d p i dp_{i} dpi形成了一個凸殼( d p i , j − d p i , j − 1 ≥ d p i , j − 1 − d p i , j − 2 dp_{i,j}-dp_{i,j-1}\geq dp_{i,j-1}-dp_{i,j-2} dpi,j−dpi,j−1≥dpi,j−1−dpi,j−2)。
上述dp有兩種轉移:
- d p i , j = d p i − 1 , j dp_{i,j}=dp_{i-1,j} dpi,j=dpi−1,j,直接複製上一個,沒啥好說的。
- d p i , j = d p i − 1 , j − 1 + w i dp_{i,j}=dp_{i-1,j-1}+w_i dpi,j=dpi−1,j−1+wi,其實可以這樣理解:將 d p i , j dp_{i,j} dpi,j與 d p i , j − 1 dp_{i,j-1} dpi,j−1的差值與 w i w_i wi取一個min。
所以我們可以
若我們維護差分陣列 : c j c_j cj= d p i , j − d p i , j − 1 dp_{i,j}-dp_{i,j-1} dpi,j−dpi,j−1
則在 c j ≥ w i c_j\geq w_i cj≥wi的部分,所有的 d p i dp_{i} dpi都為 d p i − 1 dp_{i-1} dpi−1向上移動 w i w_i wi位,並向右移動一位。
我們只需要在那個維護c陣列的平衡樹中插入一個 w i wi wi即可。同時維護字首和。
我們回到上面的那一個問題,Touch The Sky。
這裡需要有一個限制 d p i − 1 , j − 1 ≤ L i ⇔ d p i − 1 , j − 1 + W i ≤ L i + W i = L ′ i dp_{i-1,j-1}\leq L_i\Leftrightarrow dp_{i-1,j-1}+W_i\leq L_i+W_i=L\prime_i dpi−1,j−1≤Li⇔dpi−1,j−1+Wi≤Li+Wi=L′i
這其實非常好辦。
只需要在那個treap裡刪除最後一個滿足上述條件的位置即可。
這樣我們就可以將一個看似沒有辦法優化的二維dp優化到了 O ( n 2 ) O(n^2) O(n2),是不是非常神奇!
但是有人會說:“treap也太難打了吧,這麼長的程式碼比賽怎麼來得及寫啊!”。
先彆著急,Touch The Sky 這題的確可以不使用treap。
我們先看看最終題目是要求什麼?並不是任意的 d p i , j dp_{i,j} dpi,j而是凸殼的最上面的那一點的橫座標!再看看 L ′ i L\prime_i L′i有什麼性質,對,遞增,這可以保證凸殼的最高點只會升高不會降低!(為啥遞增很多題解都解釋的非常清楚了,這裡就不多說了)
所以我們從前到後考慮,每次加入一個差分值: W i W_i Wi。若 s u m > L ′ i sum> L\prime _i sum>L′i,就刪除最後的那一個(最大的那一個) p r e f i x s u m ≤ L ′ i prefix\ sum \leq L\prime _i prefix sum≤L′i的差分值(這裡的prefix sum位再treap裡維護的字首和),可以發現就是最大的那一個(前面已經分析了 L ′ i L\prime _i L′i遞增)。
所以priority_queue就ok了。
程式碼也就十多行。
相關文章
- 斜率優化(凸包優化)DP問題acm優化ACM
- [DP] DP最佳化總結
- 為什麼凸問題的解集是凸集
- 斜率優化DP總結優化
- 2024.10.2 總結(集訓;DP)
- Gym 100543G Virus synthesis 題解
- Gym102428F Fabricating Sculptures(DP+字首和)
- WQS 二分 & 凸最佳化dp
- 2024.8.31 總結(集訓 考 DP)
- 2024.8.30 總結(集訓 考 DP)
- HDU 6787 Chess 2020百度之星 初賽三 T5 題解 dp
- gym102536部分簡要題解
- 連結串列(LinkedList)解題總結
- 做題小結 DP訓練
- [Atcoder DP I]Coins 題解
- gym105167E Erdős-Ginzburg-Ziv 題解
- 揹包問題解題方法總結
- 做題小結 dp訓練6
- 凸優化問題優化
- dp一遍通+ybt題解
- 2024.10.3 總結(集訓 繼續弄昨天的 DP)
- 用多項式的逆優化dp總結優化
- 前端解決跨域問題總結前端跨域
- BZOJ 1185 [HNOI2007]最小矩形覆蓋:凸包 + 旋轉卡殼
- P6810 「MCOI-02」Convex Hull 凸包 題解
- 凸最佳化問題
- CSP-S/NOIP提高組 真題題解總結
- T02 ExtractSubject 專案開發總結
- Luogu P1777 幫助 題解 [ 紫 ] [ 線性 dp ] [ 狀壓 dp ]
- 3D Touch 詳解3D
- LeetCode 連結串列解題彙總 Java版LeetCodeJava
- 8.30 上午 becoder 模擬賽總結 & 題解
- 8.31 上午 becoder 模擬賽總結 & 題解
- 9.4 上午 becoder 模擬賽總結&題解
- 9.6 上午 becoder 模擬賽總結&題解
- Codeforces Round 984 (Div. 3) 題解總結
- Oracle:ORA-27090 問題解決總結Oracle
- 回溯法解決全排列問題總結