专题题解 - TEST_34

Solution by uwagjaynoi

题意:

维护数列,支持区间异或,求区间中所有子序列的异或和异或 $v$ 的最小值。


我们给出一种不借助差分的本题解法。

用线段树维护区间线性基,关键问题就在于如何将线性基全体异或一个数 $x$。

考虑原先的一个子集 $S$,其异或和为 $X$,那么全体异或 $x$ 后,如果 $2\mid |S|$ 则异或和仍然为 $X$,否则为 $X\oplus x$。因此,我们实际上要用一种方法来刻画子集的奇偶性。

设原先的集合为 $\langle a_1,a_2,\ldots,a_n\rangle$,现在我们将每个数前面加一个标识位,即选择 $y$ 使得 $2^y>a_i$,然后考虑 $\langle 2^y+a_1,\ldots,2^y+a_n\rangle$,这样在一组异或和中若 $2^y$ 对应的位为 $1$ 则是奇数个数异或,否则为偶数个数异或,那么我们再加上一项 $2^y+x$,就可以使得奇数个数异或就必须额外异或上一个 $x$(为了使得 $2^y$ 位为 $0$),而偶数个数异或就不能异或上这个 $x$(否则 $2^y$ 位就会是 $1$)。

所以对于原本的 $\langle a_1,\ldots,a_n\rangle$,将它首先变为 $\langle 2^y,2^y+a_1,\ldots,2^y+a_n\rangle$,然后在需要全体异或 $x$ 时将线性基上 $2^y$ 位代表元异或上 $x$,表示选择奇数个数时需要额外异或一个 $x$ 即可。

时间复杂度与常规做法相同,暂时没有发现这种做法相比差分做法的明显优越性。