1. 程式人生 > 其它 >【省選模擬】詳細題解

【省選模擬】詳細題解

3.25 黑白樹

操作 \(4,5\) 可以用樹剖 + 線段樹 \(O(n\log^{2}n)\) 輕鬆維護,但這導致不能套用 QTree7 的做法(不過可以借鑑使用兩個 DS 分別維護黑白點的套路)

稱一個點的管轄點為該點連通塊中最淺的點,可以使用樹剖 + set 求出(注意跳輕邊後特判),讓同色連通塊相關操作都基於管轄點進行。記 \(cnt\) 為一個點根鏈上異色點個數,那麼某點處於連通塊中等價於在管轄點子樹且 \(cnt\) 相等。對於線段樹上的區間,令其 \(cnt\) 等於該區間內點的 LCA 的 \(cnt\)(子樹加維護 \(cnt\) 時求出的恰好就是這個)

對於連通塊操作,先定位到管轄點子樹的 \(\log\)

個區間,同色連通塊中的點即為這些區間中 \(cnt=\) 管轄點 \(cnt\) 的點,因此對於每個線段樹結點,需要維護的是區間中 \(cnt\) 等於區間 \(cnt\) 的點,體現在程式碼上就是根據父區間與子區間的 \(cnt\) 關係進行 pushup、pushdown(注意懶標記順序)

程式碼有點小長,但不過是若干 trivial 操作的累加,並不難調