雙棧維護頭尾操作

spdarkle發表於2024-11-17

是如下的資料結構。

我們需要支援頭尾增刪,以及全域性查詢的操作。

蠢笨的做法是使用線段樹分治,但會多 \(\log\),使用雙棧可以做到線性。

操作如下:

  • 開兩個棧 \(stal,star\),分別處理頭尾的增刪

  • 增:頭增 \(stal\),尾增 \(star\)

  • 刪:與增類似,但是棧空時特別處理:

    • 雙棧大小之和不超過 \(1\) 特判

    • 否則將有數字的那個棧切為兩半,均分到兩個棧裡面 注意順序,應當是這一半倒著插入另一個棧

  • 查:合併兩個棧頂資訊。

時間複雜度考慮雙棧大小之差 \(d\),顯然 \(d\) 增量之和不超過 \(n\),而減量之和不超過 \(n\),每次調整會使得 \(d\) 減小一半,均攤同樣 \(O(n)\)

例題:

貪玩藍月

利用雙棧維護揹包模板題。

CF2026F

對於 \(1,2,3\) 操作,都新開一個版本,然後建立操作樹,這樣我們每次進入一個節點都只會進行一個操作,離開時撤銷這個操作,利用雙棧維護揹包即可。

相關文章