线性基
preface
需要一点线性空间知识
- 线性相关:在向量空间V的一组向量\(A:a_1,a_2...a_m\) 如果存在不全为零的数 \(k_1, k_2, ···,k_m\) , 使\(\sum a_ik_i=0\)则称向量组A是线性相关的,否则线性无关
- 线性表出:在向量空间V的一组向量\(A:a_1,a_2...a_m\) 如果存在一组实数 \(k_1, k_2, ···,k_m\) , 使\(\sum a_ik_i=b\),那么称b能被A线性表出
还有通俗的线性基的定义(其实线性基就是极大线性无关组,就是矩阵的秩)
- 线性基能相互异或得到原集合的所有相互异或得到的值。
- 线性基是满足性质1的最小的集合
- 线性基没有异或和为0的子集。
贪心法&高斯消元
异或线性基
二进制下拆分数x,从高位向低位扫
若x再当前位为1,就判断当前位线性基是否有值,若有就把x的当前位消掉,否则就加入线性基
询问最大值时,直接从大往小扫一遍,若变大就更新
最小值就判断是否能为0,否则就输出线性基中最小值
void add(long long x){
Fd(i,63,0) if((x>>i)&1){
if(d[i]) x^=d[i];
else{ d[i]=x;break; }
}
}
long long ask(long long x){
Fd(i,63,0) if((x^d[i])>x) x=x^d[i];
return x;
}
实数线性基
和异或差不多,就是消掉当前位的操作要用高斯消元
例题
P4151 [WC2011] 最大XOR和路径
求1到n的最大XOR路径
我们考虑把路径拆成若干环和链,假如我们先选择了一个1到n的链,我们可以找一个环拓展,具体来说,就是通过一条链到环,再遍历一遍环,再从链回来,于是发现链走了两次,就等价于只走了一个环
所以就是找到全部环(其实就是返祖边对应的环),放进线性基里,然后随便找个1到n的链询问
什么是对的?
标签:返祖,long,高斯消,学习,异或,笔记,线性,向量 From: https://www.cnblogs.com/zhy114514/p/18028178
- 随便的链如果不优,一定会被某个环更新
- 返祖边对应的环,通过一些重集可以搞出全部的环