ARC 杂题乱做
[ARC222E] XOR Matching
*2400
给定长度为 \(n\) 的序列 \(a\),有 \(a_i \in [0, 2^m - 1)\),定义 \(f(x)\) 表示最多能将 \(a\) 中的多少对元素两两配对之后每对的两个数异或和为 \(x\),需要求:
\(n \leq 2 \cdot 10^5, \ m \leq 20.\)
设 \(cnt_i\) 表示 \(a\) 中 \(i\) 的数量,那么显然:
这是显然的,因为 \(i\) 只能和 \(i \oplus x\) 配对,所以显然只能取两者数量较小的那个,注意 \(x = 0\) 的时候需要特判,因为此时是 \(\lfloor \frac{cnt_i}{2} \rfloor\)。
然后推式子(其中 \(c_i\) 是 \(cnt\) 排序后的结果,然后 \(p_i\) 是 \(c_i\) 原来是 \(cnt_{p_i}\) 排序过来的):
于是本质上只需要对每个 \(i\),算出 \(\sum_{j > i} 10^{p_i \oplus p_j}\) 即可,显然你发现它等价于强制在线修改算异或卷积,即(设 \(h_i\) 表示是否有 \(p_j\) 等于 \(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)\),可以通过。
轻微卡常。
原文地址: https://www.cveoy.top/t/topic/qHwJ 著作权归作者所有。请勿转载和采集!