关于线性基的一丢丢理解
线性基
有趣的东西
在某次考试时人人都切了一道题时才发现我没学过线性基。。。
是什么
我感觉它就是一个类似于向量基底的东西
线性基中的元素任选几个异或起来是可以表达出原数组中的所有的值的,并且不能搞出其它的数
性质
- 线性基无论怎么选集合,只要是非空的,异或起来一定不是\(0\)
- 线性基二进制最高位互不相同
- 线性基中元素互相异或,异或集合不变
- 线性基异或出原数组的异或方案唯一
- 满的线性基可以表示出所有正整数,准确来说是\(2\)的长度次方减\(1\)
求法
首先线性基中的一个元素\(a[i]\)的二进制最高位为\(1\),并且是第\(i\)位
(以下所有都是二进制下讨论的)
不断原数组插入数\(x\)
从高往低枚举位数
如果这个数的第\(i\)位为\(1\),并且\(a[i]\)为空
这一位没有就补嘛,所以\(a[i]=x\)并且\(break\)
否则,这一位有,那就减去嘛
所以\(x \ xor=a[i]\)
一个数要么被插入,要么中途为\(0\)
合并
暴力一个一个丢到另一个中
查询存在性
一个数是否能被线性基表示出来
只要执行插入类似的操作,中途为\(0\)则是
查询最值
最小值就是最小的那个
最大值:
从高位开始枚举,如果异或后变大,就异或
\(k\)小值
根据线性基二进制最高位互不相同的性质
可以得到一个方法
我们要将线性基改造成每一位相互独立
如果\(i<j\),\(a[j]\)的第\(i\)位是\(1\),就将\(a[j]\)异或上\(a[i]\)
那么就只有\(a[i]\)的第\(i\)位为\(1\)
查询的时候将\(k\)二进制拆分,对于\(1\)的位,就异或上对应的线性基
最终得出的答案就是\(k\)小值
显然
然后看一下这篇博客