是如下的資料結構。
我們需要支援頭尾增刪,以及全域性查詢的操作。
蠢笨的做法是使用線段樹分治,但會多 \(\log\),使用雙棧可以做到線性。
操作如下:
-
開兩個棧 \(stal,star\),分別處理頭尾的增刪
-
增:頭增 \(stal\),尾增 \(star\)
-
刪:與增類似,但是棧空時特別處理:
-
雙棧大小之和不超過 \(1\) 特判
-
否則將有數字的那個棧切為兩半,均分到兩個棧裡面 注意順序,應當是這一半倒著插入另一個棧
-
-
查:合併兩個棧頂資訊。
時間複雜度考慮雙棧大小之差 \(d\),顯然 \(d\) 增量之和不超過 \(n\),而減量之和不超過 \(n\),每次調整會使得 \(d\) 減小一半,均攤同樣 \(O(n)\)。
例題:
貪玩藍月
利用雙棧維護揹包模板題。
CF2026F
對於 \(1,2,3\) 操作,都新開一個版本,然後建立操作樹,這樣我們每次進入一個節點都只會進行一個操作,離開時撤銷這個操作,利用雙棧維護揹包即可。