线性基(Linear Basis)学习笔记
前言
我看网络上没有什么非常系统的教学,可能是我太菜了吧,现在才学,做个记录给自己看。
简略介绍
一个数集能两两异或,能表出许多新的数。
线性基是一个集合,能够在记录最少的数的基础上,表示出一个等价的异或集合。+
常用来解决最大异或子集问题。
下文假设 \(L\) 为值域最大值在二进制下的位数。
构造方法 & 解决问题
插入
bool insert(ll val) {
fd(i, L, 0)
if (val >> i & 1)) {
if (!b[i]) { // b[i] 是记录线性基的数组
b[i] = val;
break;
}
val ^= b[i];
}
return val;
}
如果说 \(\text{val}\) 能被表出,那么它一定会在最后变成 \(0\) 。否则,我们认定下标 \(i\) 的位置放置的数的二进制下第 \(i\) 位一定是 \(1\)。并将它插入。
不难发现,一个插入的数被填进第 \(i\) 位时,其更高位一定被全部异或 \(0\) ,故 \(i\) 是它的最高位 \(1\) 的位置。记住这个性质,会在下面使用。
插入一个数复杂度是 \(O(L)\) 的。
最大异或子集
根据上面的性质,我们从高位贪心地考虑,希望能够尽量让高位的 \(1\) 能够出现。
ll mx() {
ll ret=0;
fd(i, L, 0)
if((ret ^ b[i]) > ret)
ret ^= b[i];
return ret;
}
\(O(L)\)。
合并两个线性基
直接把一个线性基中的元素插入另一个,\(O(L^2)\) 。
求第 \(k\) 小能被表出元素
我们改造这个线性基,使得每一位相互独立。类似高斯消元。从低位到高位消。
void rebuild() {
fo(i, 1, L)
fo(j, 1, i)
if(d[i] >> (j - 1) & 1)
d[i] ^= d[j - 1];
}
ll k_th(ll k) {
// 如果算上零的话需要有特判
if(k == 1 && tot < n) return 0;//特判一下,假如k=1,并且原来的序列可以异或出0,就要返回0,tot表示线性基中的元素个数,n表示序列长度
if(tot < n) --k;//类似上面,去掉0的情况,因为线性基中只能异或出不为0的解
// 记得先 rebuild
ll ret = 0;
fo(i, 1, L)
if(d[i]) {
if(k & 1) ret ^= d[i];
k >>= 1;
}
return ret;
}
顺便一提,实际上 \(\text{rebuild}\) 之后的线性基是完全等价的,可以正常做其他操作。
删除
在线的做法太复杂了一般不考不是很优美,直接说离线吧。
在线性基的每一个位置维护一个最晚插入时间 \(t\) ,那么插入的时候
FOR i=L~0
如果 目前这一位线性基为空
则将目前这一位的线性基附为 (v1,t1)
否则:
将目前这一位的线性基记为 (v2,t2)
如果 t2<t1:
将目前这一位的线性基替换为 (v1,t1)
v2^=v1
用(v2,t2)插入下一位线性基
否则:
v1^=v2
用(v1,t1)插入下一位线性基
在查询的时候只需要看 \(t \ge t_0\) 的位置就好了。
线性基(Linear Basis)学习笔记的更多相关文章
- LDA(线性判别分类器)学习笔记
Linear Discriminant Analysis(线性判别分类器)是对费舍尔的线性鉴别方法(FLD)的归纳,属于监督学习的方法. LDA的基本思想是将高维的模式样本投影到最佳鉴别矢量空间,以达 ...
- ACM线性基学习笔记
https://www.cnblogs.com/31415926535x/p/11260897.html 概述 最近的几场多校出现了好几次线性基的题目,,会想起之前在尝试西安区域赛的一道区间异或和最大 ...
- 高斯消元 & 线性基【学习笔记】
高斯消元 & 线性基 本来说不写了,但还是写点吧 [update 2017-02-18]现在发现真的有好多需要思考的地方,网上很多代码感觉都是错误的,虽然题目通过了 [update 2017- ...
- 「线性基」学习笔记and乱口胡总结
还以为是什么非常高大上的东西花了1h不到就学好了 线性基 线性基可以在\(O(nlogx)\)的时间内计算出\(n\)个数的最大异或和(不需要相邻). 上述中\(x\)表示的最大的数. 如何实现 定义 ...
- 洛谷P3389 高斯消元 / 高斯消元+线性基学习笔记
高斯消元 其实开始只是想搞下线性基,,,后来发现线性基和高斯消元的关系挺密切就一块儿在这儿写了好了QwQ 先港高斯消元趴? 这个算法并不难理解啊?就会矩阵运算就过去了鸭,,, 算了都专门为此写个题解还 ...
- [JLOI2015]装备购买 题解 / 实数线性基学习笔记
题目链接 看这道题之前,以为线性基只是支持异或的操作... 那么,我认为这道题体现出了线性基的本质: 就是说如何用最小的一个集合去表示所有出现的装备. 我们假设已经会使用线性基了,那么对于这道题该怎么 ...
- Duilib学习笔记《06》— 窗体基类WindowImpBase
在前面的例子中我们发现,窗口都是继承CWindowWnd.INotifyUI,然后重载相关函数去实现.显然,我们发现窗口的创建流程实际上都是差不多的,主要只是在OnCreate加载的配置文件不同等等… ...
- qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)
原博主博客地址:http://blog.csdn.net/qq21497936本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78516 ...
- GIT学习笔记(5):变基
GIT学习笔记(5):变基rebase 变基 引入变基 在Git中整合来自不同分支的修改主要有两种方法:merge以及rebase. 整合分支最容易的方法是merge,他会把两个分支的最新快照以及两者 ...
随机推荐
- 制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)
实现的功能: l APP控制月球灯 l 本地月球灯控制 l APP控制"大白"颜色,实现各种颜色变身 l 门状态传感器状态APP显示 l 网络状态指示灯,连接服务器长亮, ...
- Mongodb集群调研
目录 一.高可用集群的解决方案 二.MongoDB的高可用集群配置 三.Mongo集群实现高可用方式详解 四.Sharding分片技术 一.高可用集群的解决方案 高可用性即HA(High Availa ...
- Android工具 - SQLITE3
原创文章,如有转载,请注明出处:http://blog.csdn.net/yihui823/article/details/6689922 本文章的前提:已经安装了Eclipse和ADT.androi ...
- bjdctf_2020_babyrop2(没有成功拿到shell)
看到程序先例行检查一下 可以看到开启了canary和nx保护,需要注意的是这个acnary 将程序放入ida中shift+f12 没有关键性函数.我们进入main函数中 在main的gift程序里面我 ...
- Linux 三剑客之grep
目录 Linux 三剑客之grep 搭配命令-find 三剑客之grep: 正则表达式: Linux 三剑客之grep 搭配命令-find find命令是根据文件的名称或者属性查找文件,并不会显示文件 ...
- HSPICE 电平触发D触发器仿真
一. HSPICE的基本操作过程 打开HSPICE程序,通过OPEN打开编写好的网表文件. 按下SIMULATE进行网表文件的仿真. 按下AVANWAVES查看波形图(仿真结果). 二. 网表文件结构 ...
- Python的动态语言特性; __slots__属性
python是动态语言 1. 动态语言的定义 动态编程语言 是 高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用.它是一类 在运行时可以改变其结构的语言 :例如新的函数.对象.甚至代码可以被 ...
- C#验证对象中的属性是否为空的共通方法
在后台接口处理时,经常需要对请求的参数做验证.因此提取了共通方法,方便进行判断. /// <summary> /// 数据验证工具类 /// </summary> public ...
- 分布式NoSQL数据库MongoDB初体验-v5.0.5
概述 定义 MongoDB官网 https://www.mongodb.com/ 社区版最新版本5.0,其中5.2版本很快也要面世了 MongoDB GitHub源码 https://github.c ...
- 平衡二叉树(c++实现)续
!!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist --- 欢迎指正--- 题外话:上一篇关于平衡二叉树文章中,我都没说自己是怎么理解的.别人终 ...