演算法
首先觀察對於一個確定的陣列 \(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}\)
方案數能計算出來, 想辦法也可以計算出和
善於猜狀態, 寶能做的