异或粽子 题解
原题链接:异或粽子
简述题意:给定一个序列 \(a\) ( \(a_i \leq 10^{10}\) ),长度为 \(n\) ( \(n\leq 10^5\) ), 给定正整数 \(k\) ,规定一段区间 $ [l,r] $ 的权值为 \(a_l\) 到 $ a_r $ 的异或和,问序列 \(a\) 的所有区间中,权值前 \(k\) 大的 \(k\) 个区间的权值和为多少
首先,异或具有可减性,我们规定 \(s_i= xor_{j=1}^{i} a_j\) ,则任意区间 $ [l,r] $ 的权值可以表示成 $ s_r\ xor\ s_{l-1}$ 。
其次,由于题中要求 $ i \leq j$ ,这个东西很麻烦,所以我们去掉这个限制,求出所有 $ s_i\ xor\ s_j\ (1\leq i,j \leq n)$ ,取其中前 \(2k\) 个数加和在除以 \(2\) 就是最终答案。
先规定 $ s_0=0 $ ,我们将 \(n+1\) 个 \(s\) 的取值插入 $ 01Trie $ 中,同时维护一个大根堆,堆中初始加入每个 \(s_i\) 与 \(s\) 中元素的异或的最大值。 由于 $ 01Trie $ 的特殊性,在已知 \(x\) 时,我们可以用 \(O(log\ x)\) 的时间求出 $01Trie $ 中与 \(x\) 异或值第 \(k\) 大的数是多少。
接下来每次在这个堆中取出一个最大值,累加到答案中。 当我们取出一个 \(s_i\) 与 \(s\) 中元素的异或的第 \(T\) 大值时,我们就将 \(s_i\) 与 \(s\) 中元素的异或的第 \(T+1\) 大值在插入到堆中。重复进行 \(2k\) 次,最后答案除以二即为题中所求答案。
浙公网安备 33010602011771号