題意:
數軸上在起點 \(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 中難求的貢獻?權值線段樹!