洛谷同步题解。
*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)\),可以通过。
轻微卡常。