「专题」线性基
线性基性质
- 线性基中所有的数都可以经过一些异或操作还原出原数列。
- 线性基任意几个元素异或起来不为 \(0\)。
- 若这是原数列的线性基,那么这一定是满足性质 1,2 的元素最少的一种构造方案。
线性基推论
- 最多需要 \(\mathrm {log_2(a)}\) 个数,就可以通过异或操作转化为一个数列。
构造线性基
void add(LL x, int val) {
for(int i = 62; i >= 0; i --) {
if((x >> i) & 1) {
if(!p[i]) { p[i] = x; break; }
else x ^= p[i];
}
}
}
证明性质 1:
- 如果 x 被异或到了 \(0\),那么一定存在一些线性基里的数可以异或得到它。
- 如果执行 p[i]=x,显然也可以。
证明性质 2:
异或为 \(0\) 的话,本应该加进去的时候经过一些异或就变成 \(0\) 了,矛盾。
证明性质 3:yy 一下就可以了吧。可以证明加入的顺序不改变线性基的元素个数。
另外,这个也可以判断一个数是否能被一些数异或得到。
求最大值
例题
for(int i = 60; i >= 0; i --) if((ans ^ p[i]) > ans) ans ^= p[i];
位运算的经典贪心,不展开了。
求最小值
- 线性基内元素个数 < 原数列元素个数,那么加的时候一定有一个数异或成了 \(0\),所以全局最小值是 \(0\)。
- 线性基内元素个数 = 原数列元素个数,贪心,选 \(p[0]\)。
求k小值
例题
先咕着。
合并
哈哈这个标题是诈骗的。
实际上枚举暴力差既可以了,时间复杂度:\(O(\log_2^2(n))\)。
元素删除
哈哈也咕了。
例题
[BJWC2011]元素
[TJOI2008]彩灯
CF1100F Ivan and Burgers
SCOI 2016 幸运数字
参考博文