01-Trie 的應用

dengchengyu發表於2024-08-19

01-Trie 的應用

01-trie 就是把一個整數的二進位制表示看成一個 01 字串然後插進字典樹裡。

因為我們的 01-trie 要體現像平衡樹一樣的大小關係,同時有時還需要知道異或最值等資訊,所以一般都是從高位往低位插。

01-trie 的一個節點一般可能需要維護這些資訊:左右兒子、子樹內包含的整數個數、子樹內插入整數的最大值、子樹內最大編號等。

異或極值

有一個序列,每次給出一個整數,問這個整數異或上序列中一個數的異或和的最大值是多少。

對序列建出 01-trie,考慮從根節點開始遊走至最底層,於是每次看往左右哪邊走更優。

例題 -INF:野豬騎士

基本思想是分治,然後用 01-trie 做。

這題有一個找序列中異或 \(x\) 大於 \(y\) 的位置中編號最大的位置。

也可以對序列建 01-trie,然後同樣是從根節點開始遊走,分類討論一下最優性,注意我們還需要維護子樹內插入數的編號最大值。

例題 1:最長異或路徑

欽定一個根節點,先處理出每個點到根的異或和 \(s_i\),則任意兩個點的路徑的異或和都為 \(s_i\oplus s_j\),因為它們 LCA 到根的路徑異或兩次沒有貢獻。

然後就變成了任意兩數的異或最大值,對 \(s\) 建出 01-trie,列舉一個 \(s_i\) 讓它在 01-trie 上匹配即可。

例題 2:異或粽子

配合堆或可持久化 01-trie。

維護異或和

需要從低位往高位建 01-trie。

全域性加 1

所有數的數值加 \(1\)

01-Trie 合併

類似於合併線段樹的思路,均攤複雜度是正確的。

維護異或和 & 全域性加 1 & 01-Trie合併 例題:[Ynoi2010] Fusion tree

實現平衡樹

我們可以用 01-trie 代替平衡樹,可以做到 \(O(n\log V)\),其中 \(V\) 是值域。

實現可持久化平衡樹

把 01-trie 做平衡樹的做法可持久化即可,01-trie 可持久化的方法與可持久化線段樹類似。