线性基学习笔记

线性基

preface

需要一点线性空间知识

  1. 线性相关:在向量空间V的一组向量\(A:a_1,a_2...a_m\) 如果存在不全为零的数 \(k_1, k_2, ···,k_m\) , 使\(\sum a_ik_i=0\)则称向量组A是线性相关的,否则线性无关
  2. 线性表出:在向量空间V的一组向量\(A:a_1,a_2...a_m\) 如果存在一组实数 \(k_1, k_2, ···,k_m\) , 使\(\sum a_ik_i=b\),那么称b能被A线性表出

还有通俗的线性基的定义(其实线性基就是极大线性无关组,就是矩阵的秩)

  1. 线性基能相互异或得到原集合的所有相互异或得到的值。
  2. 线性基是满足性质1的最小的集合
  3. 线性基没有异或和为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的链询问

什么是对的?

  1. 随便的链如果不优,一定会被某个环更新
  2. 返祖边对应的环,通过一些重集可以搞出全部的环
posted @ 2024-02-23 22:18  zhy_learn  阅读(1)  评论(0编辑  收藏  举报