题解:AT_abc425_g [ABC425G] Sum of Min of XOR
前言
前置知识:01 trie。
参考资料:官方题解。
分析
初步思路与规定
求一个数与若干个数异或最小值可以利用 01 trie 解决,
然而,此题中 \(M\) 可达 \(10^9\),需要进一步处理。
先建出 01 trie,考虑按结点计算贡献,同时将求和看作 \(M\) 个询问(即有询问 \([0,M-1]\),方便表达),
利用递归解决,假设当前位于结点 \(p\),目前有询问 \([l,r]\),
子节点的高度(高度指到叶子的距离,即二进制下第几位,叶子高度为 \(0\))为 \(dep\),
我们需要在当前结点计算出其子结点的贡献。
下文中,涉及到“位”的都是针对二进制。
解决问题
首先发现,询问为 \([l,r]\) 会对计算造成一些困难,
观察到,\(l,r\) 的高位部分在后续不会产生贡献,可以删去,不影响答案。
在递归的过程中,将 \(l\) 的 \([0,dep]\) 位都控制为 \(0\) 是自然的,因此,询问区间可以简化为 \([0,r]\)。
进行一些简单的分类讨论,叶子结点是递归边界,需要先用 \(dep=-1\) 判掉。
$\red{\text{当前结点有两个儿子的情况}}$
这种情况比较容易。
我们可以把第 \(dep\) 位为 \(0\) 的询问传给左儿子,
为 \(1\) 的询问传给右儿子(没有这样的询问则不传),传给右儿子的时候,注意修改 \(r\) 的最高位。
这种情况不会产生贡献。
若当前结点仅有一个儿子,
不妨设为左儿子(右儿子只是在统计贡献时有些差异)。
若 \(r<2^{dep}\),直接下传即可,没有贡献;
否则,有贡献 \(2^{dep}\times(r+1-2^{dep})\),
下传时,询问区间拆分为 \([0,2^{dep}-1],[0,r-2^{dep}]\),
发现会产生类似的询问区间,这样会造成许多重复计算,
$\red{\text{性质}}$
除了包含 \(M-1\) 的询问区间(注意,此时 \(r=M-1\) 未必成立,因为修改过高位),
其它的询问区间都有 \(r+1=2^{dep+1}\),则产生的两个询问区间相同。
令 \(dp_p\) 表示对于结点 \(p\),询问区间恰为 \([0,2^{dep}-1]\) 时的答案,计算过的就利用这个数组直接返回答案,可以减少重复计算。
复杂度分析
由于需要建 01 trie,空间复杂度是 \(O(N\log{A})\),其中值域 \(A=10^9\),
先分析 \(\exist k,M=2^k\) 的情况,此时,拆分出来的区间都相同,每个结点的贡献仅计算一次,时间复杂度 \(O(N\log{A})\)。
一般地,设 \(k\) 是满足 \(2^k\le M\) 的最大自然数,
则包含 \(M-1\) 的区间在拆分时,至多拆分出一个 \(r+1\ne 2^{dep}\) 的区间,另一个(可能没有)满足 \(r+1=2^{dep}\),
这些部分单独计算即可,每个高度仅有一个这样的区间,共 \(\log{A}\) 个,不影响复杂度。
代码
提交记录。
补充
官方题解中没有显式建出 trie 树,可以前往学习。
蒟蒻在赛时写了一个仍存在少量重复计算的方法,时间复杂度 \(O(N\log^2{A})\),但好像比一个 \(\log\) 没慢多少,赛时记录。

浙公网安备 33010602011771号