1. 程式人生 > 實用技巧 >CF938G Shortest Path Queries 解題報告

CF938G Shortest Path Queries 解題報告

給出一個連通帶權無向圖,邊有邊權,要求支援 \(q\) 個操作:

1 x y d 在原圖中加入一條 \(x\)\(y\) 權值為 \(d\) 的邊

2 x y 把圖中 \(x\)\(y\) 的邊刪掉

3 x y 表示詢問 \(x\)\(y\) 的異或最短路

\(n,m,q\le 200000\)

一道很經典的線段樹分治題目,可以將詢問按時間建出下標線段樹,將修改的新增和刪除看做對於一段時間區間的修改。

像一般的線段樹區間操作的方法,每個節點存下懶標記,再遍歷整棵線段樹。

關於沒有修改的做法,具體可看 [WC2011]最大XOR和路徑 解題報告 ,對於當前圖求出線性基,再隨便找一個異或路徑放進去比較。

對於每個詢問時圖的線性基,根據線性基的優秀性質,儲存和傳遞的複雜度都十分小,可以在當前節點接受父親的線性基後在將懶標記裡的邊依次插入,然後繼續下傳一直到葉子節點。

至於異或路徑,可以通過可撤銷的並查集做到 \(\mathcal{O(n\log n)}\) ,注意到了葉子節點時也要撤回葉子節點懶標記的邊的插入,不然就會像我一樣調一個月