標記永久化:1:26:00
如果外層線段樹為下標線段樹會發現沒有辦法快速維護,這個時候我們就要想到權值線段樹:外層採用權值線段樹,其每個節點維護一顆下標線段樹,表示這個節點所代表的權值在序列中有多少個。如果\(n=5\),值域大小為\(5\),那麼權值線段樹如下
比如\([4,5]\)這個節點,維護了一顆線段樹,如下
對於這棵線段樹中的\([1,3]\)這個節點,表示的是\(4\)和\(5\)在序列下標為\([1,3]\)中出現的總次數
於是修改就可以變成\(O(\log^2n)\)了
對於查詢,很容易想到用二分,但是時間複雜度為\(O(\log^3n)\);線段樹加二分我們一定要想到線段樹二分,這樣時間複雜度就會變成\(O(\log^2n)\)了
對於內層線段樹,肯定要使用動態開點;對於區間修改可以使用懶標記和標記永久化,這裡如果使用懶標記的話,下傳的時候如果兒子沒有開點是要先開一個點的,這樣可能會導致多開很多個點,於是MLE,所以用標記永久化更能過