重修 线性基
Luogu 例题
Someone's Blog
概念
(自己总结的)
大小 \(\log n\) 的数组来表述一个大小为 \(n\) 的原数组的异或问题的数据结构。
本质
多维向量的作为基底的特殊形式,可用高斯消元理解。
构造
本构造线性基中每一个数 \(x\) 都对应了原来每一个二进制位,即 \(upperbit(x)\),所以线性基的二进制最高位互不相同。
我们构造 \(\{a\}\) 的线性基 \(\{p\}\)。
每次插入一个数 \(x\in\{a\}\),如果 \(\exists y\in\{p\}\ |\ upperbit(x)=upperbit(y)\)(即若 \(y\) 想加入线性基,她所属的二进制位已被占),则 \(x'=x\operatorname{xor} y\),这使得 \(upperbit(x')
void insert(int x){
for(int i = 63;i>=0;i--){
if(x&(1ll<
实战
开头的例题:查询一个数集的任意子集的异或最大值
建立线性基,贪心从高位到低位。
for(long long i=62;i>=0;i--)
if((p[i]^ans)>ans)
ans^=p[i];
My Record
AtCoder:给定 \(\{a_1,\dots,a_{2^n-1}\}\),求一组 \(S=\{1,\dots,2^n-1\}\) 的线性基 \(\{p\}\) 使得 \(\sum_{x\in p}a_x\) 最小
链接
贪心:按 \(a_x\) 将 \(S\) 排序,顺序遍历贪心取入答案,具体见代码。
My Record