K大數查詢

最爱丁珰發表於2024-08-31

標記永久化:1:26:00

如果外層線段樹為下標線段樹會發現沒有辦法快速維護,這個時候我們就要想到權值線段樹:外層採用權值線段樹,其每個節點維護一顆下標線段樹,表示這個節點所代表的權值在序列中有多少個。如果\(n=5\),值域大小為\(5\),那麼權值線段樹如下

image

比如\([4,5]\)這個節點,維護了一顆線段樹,如下

image

對於這棵線段樹中的\([1,3]\)這個節點,表示的是\(4\)\(5\)在序列下標為\([1,3]\)中出現的總次數

於是修改就可以變成\(O(\log^2n)\)

對於查詢,很容易想到用二分,但是時間複雜度為\(O(\log^3n)\);線段樹加二分我們一定要想到線段樹二分,這樣時間複雜度就會變成\(O(\log^2n)\)

對於內層線段樹,肯定要使用動態開點;對於區間修改可以使用懶標記和標記永久化,這裡如果使用懶標記的話,下傳的時候如果兒子沒有開點是要先開一個點的,這樣可能會導致多開很多個點,於是MLE,所以用標記永久化更能過

相關文章