线性基学习笔记

源自 link

定义

异或和

设 S 为一无符号整数集,定义异或和 \(\rm xor-sum(S)=S_1 \rm xor S_2 \rm xor \dots S_{|S|}\)

张成

\(T \subseteq S\),所有这样的自己 \(T\) 的异或和组成的集合称为 \(S\) 的张成,记作 \(span(S)\)

线性相关

对于一个集合 \(S\),如果存在一个元素 \(S_j\),使得,\(S\) 在去除这个元素后得到的集合 \(S'\) 的张成 \(span(S')\) 中包含 \(S_j\),则称 \(S\) 线性相关。

相对的,如果不存在这样的元素 \(S_j\),则称 \(S\) 线性无关

线性基

我们称 \(B\) 是集合 \(S\) 的线性基,当且仅当:

  1. \(S\) \(\subseteq\) \(\rm span(S)\)

  2. \(B\) 线性无关

线性基的个数称为长度

线性基的基本性质:

  1. \(B\) 是极小的满足线性基性质的集合,它的任何真子集都不可能是线性基
  2. \(S\) 中任意元素都可以唯一表示为 \(B\) 中若干元素异或起来的结果

构造

设集合 S 中最大的数在二进制意义下有 L 位,使用一个 \([0..L]\) 的数组 \(a\) 来存储线性基。

这种构造保证了一个特殊性质,对于每个 \(i\)\(a_i\) 以下两种可能:

  1. \(a_i=0\),并且
    \(\circ\) 只有满足 \(j>i\)\(a_j\) 的第 \(i\) 个二进制位可能为 \(1\)
  2. \(a_i\neq 0\),并且
    \(\circ\) 整个 \(a\) 数组中只有 \(a_i\) 的第 \(i\) 个二进制位为 \(1\)
    \(\circ\) \(a_i\) 更高的二进制位一定为 \(0\)
    \(\circ\) \(a_i\) 更低的二进制位可能位 \(1\)

我们称第 i 位存在于线性基中,当且仅当 \(a_i\neq 0\)

证明

显然特殊性质成立。

首先将 \(S\) 中的数插入到集合 \(B\) 中。对于一个 t 若它被消成 \(0\) 则说明可以被线性基表示,若插入到 \(B\) 中,考虑在之前已经做了若干次异或变换,而这些变换都是可逆的,所以用 \(a\) 中元素可以表示插入的元素。

单次插入 \(O(\log t)\),空间同样为 \(O(\log t)\)

合并

两个线性基在 \(O(\log^2 t)\) 时间内合并,意义是用一个合并后的线性基表示 \(S_1\)\(S_2\)

暴力插入就完事了

题目

毛毛虫(没权限也看不了

看到集合中取数做异或立刻想到线性基,显然有一个 \(O(n^2\log V)\) 的做法……

转化一下看看能不能树上启发式合并,似乎不太行,但是考虑到自身到根的一条道路不存在,可以联想到出栈序,随即想到拍到序列上维护。

然后就得到一个 \(O(n\log^2V)\) 的做法,拍到序列上,然后暴力合并两个线性基。

考虑这个线性基具有饱和性,即插入 \(O(\log V)\) 就不能继续相里插入元素。

所以可以只合并这 \(O(\log V)\) 个线性基。

复杂度做到 \(O(n\log V\ +\ \log^4V)\)

代码

说一点自己自己对这个东西的理解

考虑这是一个 \(\log V\) 的向量,线性基中的元素相当于基向量,使用基向量来线性组合出某个向量 \(x\)。特殊地,系数只能为 \(0\)\(1\)

posted @ 2021-10-19 19:26  ·Iris  阅读(127)  评论(0)    收藏  举报