【24noip十连测day1】异或症测试(线性基)
题意
给定一棵带权仙人掌,有 \(q\) 次询问,给出 \(x,y,k,s\),并令一条简单路径的权值为路径上所有边的异或和,令 \(S\) 为所有 \(x,y\) 之前的简单路径的权值所形成的不可重集合,再令 \(T=\{x|x\in S,x\operatorname{and} s=s\}\),你需要求出集合 \(T\) 的第 \(k+1\) 小值。
\(n\le 2\times10^5,q\le 5\times10^4\)
分析
若图是一颗树,令 \(sum_i\) 为 \(i\) 到根的路径的权值,答案即为 \(sum_x\oplus sum_y\)。
若图是一棵仙人掌,对于 \(x\rightarrow y\) 上的所有的环,那么 \(S\) 就是 \(sum_x\oplus sum_y\) 再异或上某些环的权值构成的集合(表示可以选择走环的顺时针方向和逆时针方向)。不考虑 \(s\) 的限制,那么把所有环的权值扔到线性基里,对线性基求 \(k\) 小值即可。
考虑询问,把圆方树建出来,并把环的权值挂在方点上,预处理出一个点到根节点的线性基 \(T_i\),每次询问需要将 \(T_x,T_y\) 合并,但此时线性基中会有不在链上的权值。考虑可删除线性基的处理套路,每次插入要尽可能的使深度更大,这样查询的时候把深度小于 lca 的那部分扔掉即可。
现在考虑 \(s\) 的限制,考虑把原线性基对 \(b_i\operatorname{and}s\) 在做一遍线性基(注意线性基里存的数是 \(b_i\) 不是 \(b_i\operatorname{and}s\)),但这个新线性基有一点不同:新线性基每一位存的数的最高位不一定是这一位,仅仅是这个数在这一位下为 1。根据线性基的性质,新线性基里的所有数能表示出所有的 \(\operatorname{and} s\) 后的数(原线性基也能)。如果它不能使 \(val\) 包含 \(s\),那么就无解。
有几个关于求新线性基的点:
- 求新线性基中每一位的元素时,可以在原线性基中比这一位更高的元素去找,在该位下为 1 的元素。同时,由于符合条件的数有很多,为了保持新线性基的性质(不能让线性基某一位的数存在与 \(s\) 意义下比这一位更高的位使得此数在该位下为 1)。
否则,将新线性基之外的数通过与新线性基里的数异或使得其与 \(s\) 互斥(即 \(x\operatorname{and}s=0\)),根据新线性基的性质,我们总是能做到。
然后,我们任意选新线性基之外的数,根据新线性基的性质,我们总能通过异或新线性基里的数使得结果包含 \(s\)。所以,能异或出来的数的数量为 \(2^{原线性基大小-新线性基大小}\)。
同时,将在新线性基中的数从原线性基中删去,由于此时原线性基所有数不包含 \(s\),所以直接照常做第 \(k\) 小即可。
时间复杂度 \(O(n\log n+q\log^2n)\)。

浙公网安备 33010602011771号