2024.1.23 模擬賽

心海秋的墨木仄發表於2024-04-05

郊遊

首先需要快速找到當前適配度最大的一對小朋友。容易發現 \(a,b\) 的適配度即為 \(a,b\) 二進位制下最長公共字尾的長度,於是先翻轉所有數的二進位制串並插入到 Trie 中。那麼 \(a,b\) 的適配度即為 \(a,b\) 所代表葉子節點的 \(\rm LCA\) (最近公共祖先)深度。

若 Trie 中以 \(x\) 為根的子樹中仍有大於 \(1\) 個點未匹配,那麼不會選擇一對 \(a,b\) 滿足 \(a\)\(x\) 子樹內而 \(b\) 不在。即每個子樹內最多留下一個數未被匹配。

於是設 \(dp_x\) 表示 \(x\) 子樹內已匹配的匹配值異或和,\(a_x\) 表示 \(x\) 子樹內未匹配的數(若不存在未匹配的數,\(a_x=-1\) )。轉移時只有當 \(a_{ls}\not=-1\)\(a_{rs}\not=-1\) 時那麼可以將兩個數匹配,其餘情況均保留未匹配數。

task 1

暴力的刪除每個數,然後做上述 \(dp\) 即可。時間複雜度 \(\mathcal O(n^2\log W)\)。其中 \(W=\max w_i\)

task 2

發現最終的 Trie 是一顆完全二叉樹,所有的葉子將會直接與兄弟匹配,貢獻 \(0\) 的匹配度。而刪除 \(x\) 後會使得原本和 \(x\) 一組的數字單獨被分為一組。時間複雜度 \(\mathcal O(n)\)

task 3

給定條件就是從一棵完全二叉樹中刪去幾個數。考慮類似 task2 的條件,每刪除一個數 \(x\) 就會導致原本與 \(x\) 形成匹配的數變成未匹配數。那麼最多刪除 \(700\) 個數,即最多有 \(700\) 個未匹配數,按照 task 1 的方法做即可。

task 4

若我們刪除的數字為 \(w\) ,那麼只有滿足子樹內包含 \(w\) 的節點的 \(dp\)\(a\) 會發生變動。我們只需要最開始預處理所有點的 \(dp\) 值,然後每次詢問暴力更新這 \(\mathcal O(\log W)\) 個節點的值即可。時間複雜度 \(\mathcal O(n\log W)\)