线性基模板

线性基是一种处理异或和极值问题的数学工具,适用于ACM竞赛。它涉及概念、性质、代码实现,包括构造、插入、最大值、最小值、是否包含特定值、第k小值等操作。此外,还有线性基的合并、相交、区间查询的离线加速方法以及封装的单个线性基。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线性基

概念

一组线性无关1的向量可以作为一组基底,形成一个线性向量空间,这个基底就被称为 线性基。将这个线性基的基底进行线性运算,可以表示向量空间内的所有向量,即所有向量可以拆成基底的线性组合2

特殊情况:一个线性空间的所有的法向量可以构成一个线性基


应用

处理有关 异或和的极值问题

原理:

  1. 一个值转化为二进制表示长为n位,那么这就可以看作一个n维向量,那么就可以将其拆解为n个基底向量的线性组合
  2. 由于异或运算的封闭性3,向量组 { a , b } \{a,b\} { a,b}的基底与 { a , a ⊕ b } \{a,a\oplus b\} { a,ab}相同
  3. 由于线性基要求线性无关1,所以当一个值 x x x要插入线性基 D D D时,插入的实际值为 x ⊕ ∑ d i ∈ D ⊕ d i x\oplus \sum_{d_i\in D}\oplus d_i xdiDdi
  4. 若存在 A ⊆ D A\subseteq D AD,使得 x ⊕ ∑ d i ∈ A ⊕ d i = 0 x\oplus\sum_{d_i\in A}\oplus d_i = 0 xdiAdi=0,则代表 x x x已经能被 D D D线性组合而成,无需插入 x x x。(线性无关要求)

性质

  1. 设线性基的异或集合中不存在0。
  2. 线性基的异或集合中每个元素的异或方案唯一,其实这个跟性质1是等价的。
  3. 线性基二进制最高位互不相同。
  4. 如果线性基是满的,它的异或集合为 [ 1 , 2 n − 1 ] [1,2^n−1] [1,2n1]
  5. 线性基中元素互相异或,异或集合不变。

代码实现

构造

直接遍历所有元素进行单元素插入


插入

// 线性基
// 将值 x 插入 线性基d
const int size = 64; // 基的最多个数为 x的二进制位数
long d[size];
bool insert(int id, long x)
{
   
   
    for (int i = 31; i >= 0; i--)
        if (x & (1LL << i))
        {
   
   
            if (!d[i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值