MEXimize the Score

Yorg發表於2024-12-09

演算法

首先觀察對於一個確定的陣列 \(x\) , 怎麼去計算這樣的答案

對於每一個值 \(u\) , 假設其出現次數為 \(Ap_u\) , 那麼最多產生的貢獻就為 \(\displaystyle\min_{v \leq u} Ap_v\) , 原因是顯而易見的

那麼怎麼對於每一個子串串都計算答案呢, 我們考慮串串之間的共同點, 對於每一個值, 我們只是取的個數發生了改變, 本質上沒有變化, 聯想到 這道題\(\rm{trick}\) , 我們考慮用值來遞推答案

\(dp_{i, j}\) 表示考慮到值 \(i\) , 其中 \(\displaystyle\min_{v \leq i} Ap_v = j\) 時的方案數, 那麼可以推出柿子

\[dp_{i, j} = \sum_{k \geq j} dp_{i - 1, j} \cdot {Ap_i \choose k} + \sum_{k > j} dp_{i - 1, k} \cdot {Ap_i \choose j} \]

初始化令 \(dp_{0, j} = {Ap_0 \choose j}\)

字首和最佳化 + \(j\) 的總和是 \(\mathcal{O} (n)\) 的, 所以線性

答案比較特殊, 當之後的數字沒有考慮到的時候, 他是不影響當前的方案的, 所以後面任意選擇, 即為

\[\sum dp_{i, j} \cdot 2 ^ {\sum_{i < u < n} Ap_u} \cdot j \]

實現

框架

先預處理所有需要的數學柿子, 然後遞推計算即可

程式碼

程式碼不想寫了, 注意預處理 \(inv\) 陣列

總結

善於總結結論

善於利用共同點最佳化演算法, 屬於一種 \(\rm{trick}\)

方案數能計算出來, 想辦法也可以計算出和

善於猜狀態, 寶能做的