码迷,mamicode.com
首页 > 其他好文 > 详细

线性基

时间:2019-02-21 09:48:01      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:oid   style   for   mem   close   插入   merge   src   pen   

感觉上跟高斯消元很像但是实际上好写一些。

很重要的思想是贪心。证明不会。

构造:依次考虑,如果没有就插入,有就异或。

取最大值:依次考虑,如果异或之后变大就异或。

合并: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 树上倍增/点分治 + 线性基合并。注意点分治不能处理单个点的情况,特判。

 

线性基

标签:oid   style   for   mem   close   插入   merge   src   pen   

原文地址:https://www.cnblogs.com/huyufeifei/p/10410326.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!