ARC 杂题乱做

ARC222E XOR Matching

洛谷同步题解。

*2400

给定长度为 \(n\) 的序列 \(a\),有 \(a_i \in [0, 2^m - 1)\),定义 \(f(x)\) 表示最多能将 \(a\) 中的多少对元素两两配对之后每对的两个数异或和为 \(x\),需要求:

\\\sum_{x = 0}\^{2\^m - 1} f(x) 10\^x \\

\(n \leq 2 \cdot 10^5, \ m \leq 20.\)


设 \(cnt_i\) 表示 \(a\) 中 \(i\) 的数量,那么显然:

\f(x) = \\frac{1}{2} \\sum_{i = 0}\^{2\^m - 1} \\min(cnt_i, cnt_{i \\oplus x}) \\

这是显然的,因为 \(i\) 只能和 \(i \oplus x\) 配对,所以显然只能取两者数量较小的那个,注意 \(x = 0\) 的时候需要特判,因为此时是 \(\lfloor \frac{cnt_i}{2} \rfloor\)。

然后推式子(其中 \(c_i\) 是 \(cnt\) 排序后的结果,然后 \(p_i\) 是 \(c_i\) 原来是 \(cnt_{p_i}\) 排序过来的):

\\\begin{aligned} \\sum_{x = 1}\^{2\^m - 1} f(x) 10\^x \&= \\sum_{x = 1}\^{2\^m - 1} 10\^x \\frac{1}{2}\\sum_{i = 0}\^{2\^m - 1} \\min(cnt_i, cnt_{i \\oplus x}) \\\\ \&=\\frac{1}{2} \\sum_{i = 0}\^{2\^m - 1} \\sum_{j \\ne i} \\min(cnt_i, cnt_j) 10\^{i \\oplus j} \\\\ \&=\\frac{1}{2} \\sum_{i = 0}\^{2\^m - 1}\\sum_{j \\ne i} \\min(c_i, c_j) 10\^{p_i \\oplus p_j} \\\\ \&= \\frac{1}{2}\\sum_{i = 0}\^{2\^m - 1} \\left( \\left( \\sum_{j \< i} c_j \\cdot 10\^{p_i \\oplus p_j}\\right) +\\left( \\sum_{j \> i} c_i \\cdot 10\^{p_i \\oplus p_j} \\right) \\right) \\\\ \&= \\frac{1}{2}\\left( \\sum_{i = 0}\^{2\^m - 1} c_i \\sum_{j \> i} 10\^{p_i \\oplus p_j}\\right) + \\frac{1}{2}\\left( \\sum_{j = 0}\^{2\^m - 1} c_j \\sum_{i \> j} 10\^{p_i \\oplus p_j}\\right) \\\\ \&= \\sum_{i = 0}\^{2\^m - 1} c_i \\sum_{j \> i} 10\^{p_i \\oplus p_j}\\end{aligned} \\

于是本质上只需要对每个 \(i\),算出 \(\sum_{j > i} 10^{p_i \oplus p_j}\) 即可,显然你发现它等价于强制在线修改算异或卷积,即(设 \(h_i\) 表示是否有 \(p_j\) 等于 \(i\)):

\ans_x = \\sum_{i = 0}\^{2\^m - 1} 10\^{x \\oplus i} h_i = \\sum_{i \\oplus j = x} 10\^j \\cdot h_i \\

即考虑 \(\{10^i\}\) 和 \(\{h\}\) 的异或卷积的第 \(p_i\) 位,就是 \(i\) 的答案,我们要支持的是单点修改 \(h\),于是朴素 poly 做法肯定没有,于是直接根号分治,有值的 \(p\) 只有 \(n\) 个,设块长为 \(B\),每经过 \(B\) 位就先 FWT 暴力卷一次,然后每次查询 \(i\) 答案就是 \(ans_{p_i}\) 再暴力遍历它后面最多 \(B\) 个。

复杂度是 \(O(\frac{n}{B} 2^m m + n B) \ge O(n \cdot 2^{\frac{m}{2}} \sqrt m)\),可以通过。

轻微卡常。