Sol
不妨思考操作三的本質:對於先前插入的某個當前值為 \(x\) 的數,將其分裂為 \(x\) 與 \(x-w\)。其中 \(w\)
考慮 \(w\) 如何更新,顯然遇到二操作就加上對應的 \(x\),遇到三操作則翻倍即可。
進一步地,我們這樣描述問題:對於某一個插入操作,我們考慮它後面的二三操作,遇到二操作則減去對應的 \(x\),遇到三操作則可以選擇減去對應的 \(w\) 或不變,求最後有多少種可能的 \(x\'>0\),再對所有插入操作求和。
注意到相鄰兩個三操作的 \(w_1,w_2\) 滿足 \(2w_1 \leq w_2\)。故除開一段 \(w=0\) 的前綴,剩下的三操作只有 \(\log v\)
\(w=0\) 的三操作對插入的貢獻即為 \(ans \gets 2ans\)。此時剩餘部分轉化為:有一個大小不超過 \(\log v\) 的集合 \(S\),且滿足 \(\forall i>1,2S_i \leq S_{i-1}\),求它有多少子集和小於 \(x\)。從大到小,枚舉當前元素選不選,選則繼續遞歸,不選則剩下的數可以任意 選擇,直接計算即可。
時間複雜度 \(O(n \log v)\)。