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)\),可以通过。

轻微卡常。

posted @ 2026-09-09 20:23  rgw2010  阅读(27)  评论(0)    收藏  举报