线性基
Posted huyufeifei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性基相关的知识,希望对你有一定的参考价值。
感觉上跟高斯消元很像但是实际上好写一些。
很重要的思想是贪心。证明不会。
构造:依次考虑,如果没有就插入,有就异或。
取最大值:依次考虑,如果异或之后变大就异或。
合并:log2暴力。
性质:线性基中的元素任意异或不会为0。线性基能异或出所有成功插入进它的元素。
1 struct Base { 2 LL a[63]; 3 Base() { 4 memset(a, 0, sizeof(a)); 5 } 6 inline void insert(LL x) { 7 for(int i = 62; i >= 0 && x; i--) { 8 if(((x >> i) & 1) == 0) { 9 continue; 10 } 11 if(!a[i]) { 12 a[i] = x; 13 break; 14 } 15 x ^= a[i]; 16 } 17 return; 18 } 19 inline LL getMax(LL ans) { 20 for(int i = 62; i >= 0; i--) { 21 if((ans ^ a[i]) > ans) { 22 ans ^= a[i]; 23 } 24 } 25 return ans; 26 } 27 inline void merge(const Base &w) { 28 for(int i = 62; i >= 0; i--) { 29 if(w.a[i]) { 30 insert(w.a[i]); 31 } 32 } 33 return; 34 } 35 };
题目:
bzoj2460 贪心插入。正确性不会。
bzoj2115 构出搜索树,发现所有环都能够取到,于是把所有环的异或和插入线性基。随便找一条路径的权值,扔进线性基中找最大值。
loj#2013 树上倍增/点分治 + 线性基合并。注意点分治不能处理单个点的情况,特判。
以上是关于线性基的主要内容,如果未能解决你的问题,请参考以下文章