【某NOIP模擬賽T2 - 旅遊】--線段樹最佳化 DP 的魅力

慕斯ひいきする發表於2024-11-05

題意:

數軸上在起點 \(s\) 和終點 \(t\) 間的整點中有 \(n\) 個關鍵點,第 \(i\) 個關鍵點位置為 \(c_i\),可獲得 \(m_i\) 的價值。你可以從起點開始,每次跳至多 \(z\) 個點(跨過中間的點),而每到達一個 \(s\) 以外的點需要支付 \(a\) 的代價,求走到終點的最大價值。

\(0\le s\le c_i\le t \le 10^9,n\le 10^5\)

這種題目一眼 DP 好吧​

\(f_i\) 表示前 \(i\) 個關鍵點的答案,首先考慮 \(O(n^2)\) 的暴力轉移

\[f_i = \min\{f_j + \lceil \frac{c_i-c_j}D \rceil \cdot a_i - m_i \} \\ \]

然後有個蠢蛋打表打小了,以為滿足決策單調性QwQ

發現最佳化的瓶頸在於這個煩人的上取整除法

眾所周知,上下取整,取模之類的運算都可以拆成普通的運算

發現 \(c_i,c_j\) 同時加 \(k\cdot D\) 並不會影響上取整(即其相對大小關係)帶來的貢獻,那麼我們不妨將這個取整拆開?

\(c_i = k_i \cdot D + b_i\)

成功將貢獻轉移到 \(b_i,b_j\) 的大小關係上!

\[f_i=\min\{ f_j+(k_i-k_j + \lceil \frac{b_i-b_j}D \rceil) \cdot a_i \} - m_i \\ \because b_i,b_j \in [0,D) \therefore b_i-b_j \in (-D,D) \]

這樣我們就讓煩人的上取整簡化成 \([b_i>b_j]\) ,於是丟到以 \(b_i\) 為下標的 最小值權值線段樹 裡去做就行了

總結:拆 DP 中難求的貢獻?權值線段樹!

相關文章