1. 程式人生 > 實用技巧 >「賽前備戰」NOIp2020-提高 圖論訓練

「賽前備戰」NOIp2020-提高 圖論訓練

博主太菜,可能會炸聯賽,於是惡補一下 QAQ

題目比較基礎,動態更新

Tags

生成樹最短路差分約束樹的直徑與重心LCA樹鏈剖分拓撲序強連通分量 割點 點雙連通分量邊雙連通分量2-SAT二分圖正/負環最小環

「Codeforces 888G」Xor-MST

update - 2020.8.4

此題需要用到一個叫 Borůvka 的最小生成樹演算法,大致就是對現在的每一個連通塊都找一遍的最短邊,最後每個連通塊擇優,將這些邊全部連上。這樣複雜度之正確的原因可以參考啟發式合併,\(O(|E|\log |V|)\)

對於此題,我們以可以用這樣的思路來“擇優合併”,即選取兩個結點 \(u, v\)

,使得 \(a_u \oplus a_v\) 最小,然後合併。現在如何找到這個最小的就是個問題。

對於兩個二進位制數 \(x = (10001010)_2,y = (10000110)_2\),前 \(4\) 位相同,即 \(\text{lcp} = 4\),那麼異或一次前四位都是 \(0\)。我們優先考慮二進位制下 \(\text{lcp}\) 較大的。

和字首有關,於是可以斷定是 01-Trie。轉化到樹上,lcp 就成了兩個葉子的 LCA,那麼我們就該優先考慮 LCA 深度較深的。

遍歷整顆 Trie,找到這些 LCA,然後對於一個 LCA,列舉左兒子值域中的所有數 \(a_i\),然後在右子樹中查詢,並使路徑上的 0/1 值儘量和 \(a_i\)

一樣以達到異或後最小化的目的。最後這些查詢的最小值的和即為所求。

時間複雜度 \(O(n\log n\log a)\)