莫(tui)名(wan)其(ti)妙(jie)又弄完了一个专题?
刚开始以为这个知识点出题都是板子来着,后来做题才发现我太天真了啊
先列知识点吧
- 1.性质
(1). 原序列异或能得到的所有数都可以由线性基中的一些数异或得到
(2). 线性基里面的任意一些数异或起来都不能得到 (0)
(3). 线性基里面的数的个数唯一,并且在保持性质一的前提下,数的个数是最少的
(4). 若线性基中有k个元素,则原序列异或能得到的数一共有 (2^k) 种,每种有 (2^{n-k}) 个
(5). 线性基中元素互相异或,异或集合不变
- 2.构造
从高到低扫描线性基中的每一位
如果这一位没有值但是 (x) 的这一位有值,则令线性基这一为 (x)
否则令 (x=x xor b[i])
放个代码
inline bool insert(ll x){
for(int i=63;i>=0;i--){
if(x&(1ll<<i)){
if(!d[i]){
d[i]=x;
return 1;
}
else x^=d[i];
}
}
return 0;
}
- 3.使用
求异或最大(最小)值
从高到低(低到高)扫描线性基中的每一位,如果 (x xor b[i]>(<)x) 则令 (x=x xor b[i])
求第 (k) 小值
先处理一下,使得线性基中每一个元素作用都变为提供他的最高位元素
具体实现中,我们从低到高处理每一位 (i),然后枚举 (0~i-1) 如果 (b[i]) 的第 (j) 位为 (1),则 (b[i]=b[i] xor b[j])
求解的时候,将 (k) 先转成二进制,假如 (k) 的第 (i) 位为 (1),(ans) 就异或上线性基中第 (i) 个元素
求 (x) 的排名
和上面一样的处理
然后一样从小到大枚举每一位,尝试用线性基中的数表示 (x)
若当前是线性基中的第 (i) 个数,则 (ans+=1<<i)
据说能删除?我不会啊。。。。。。咕咕了
- 4.题解包
元素
题目描述:有一些物品,有权值和序号,求序号全部非空子集异或和不为0的情况下最大的权值和
把物品按照权值从大到小排序,尝试插入线性基就行了
(shallot)
题意描述:小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏。
每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,
并且让小葱从自己手中的小葱苗里选出一些小葱苗使得选出的小葱苗上的数字的异或和最大。
这种小问题对于小葱来说当然不在话下,但是他的身边没有电脑,于是他打电话给同为 (OI) 选手的你,你能帮帮他吗?
你只需要输出最大的异或和即可,若小葱手中没有小葱苗则输出 (0) 。
虽然我不会删除但是我会撤销啊
线段树分治一下就完了
幸运数字
题意描述:求树上某条路径上的最大异或和
用倍增数组来维护线性基就行了
(albus) 就是要第一个出场
题意描述:求某个数在原序列所有异或和中的排名
性质4+查排名就没了
玛里苟斯
题意描述:对序列中所有子集异或和 (x) ,求 (sum x^k)
毒瘤题啊
正解是测试点分治
- 1.(k==1)
发现只要原序列中某些数二进制第 (i) 位不为 (0),则这一位是否为 (0) 的概率都为 (frac{1}{2})
枚举一下就好了- 2.(k>=3)
由于最终答案 (<2^{63}),所以原序列的数位数不可能超过 (21) 位
暴力枚举选线性基的每一项就行了- 3.(k==2)
如果分开考虑每一位,则 ((b_1+b_2+b_3+...+b_{63})^2=sumlimits_{i=1}^{63}sumlimits_{i=1}^{63}b_ib_j)
考虑暴力枚举每两位,如果存在某一个数的第 (i) 位与第 (j) 位不相等,则对答案的贡献为 (frac{1}{4}),否则为 (frac{1}{2})
注意虽然结果不会爆 (unsigned long long),但是过程会爆。。。。。。
梦想封印
题意描述:给定一张无向图,边带边权,问删掉某些边后从原点出发的路径异或和不为 (0) 的有多少种
图很不兹瓷啊,考虑维护一棵树
删边很不友好啊,考虑时光倒流,删边变成加边
然后正式开始做题
发现是路径异或和那么可以发现一个结论:每个环可以和任意一条和他联通的路匹配(异或的性质)
那么我们可以考虑对于环和路径分开来考虑
对于每个环,可以视作一个物品,把他们插入线性基中这样贡献为 (2^cnt)
对于每条路径,可以很容易处理出来 (1) 号点到每个点 (x) 的异或和 (dis_i),
把这个 (dis) 在线性基里消除可以用线性基表示的部分然后插入 (hmap) 就行了
注意每次成功插入线性基后需要更新 (hmap)
答案为 (size imes 2^{cnt})
(DZY Loves Chinese II)
题意描述:给定一张无向图,每次询问删掉某些边后图是否联通
真正的线性基好题你根本看不出是线性基
还是考虑维护一棵树
发现不联通的有这两种情况
1.同时割掉一条树边和所有覆盖它的非树边
2.同时割掉被相同集合覆盖的两条树边
我们考虑这样构造
给每条非树边不同的权值,给树边赋值为所有覆盖它的非树边权值异或和
发现当边权范围足够大的情况下如果某个被删除边集的异或和为0则图不联通
这玩意可以用线性基来判断