zoukankan      html  css  js  c++  java
  • 线性基学习笔记

    源自 link

    定义

    异或和

    设 S 为一无符号整数集,定义异或和 ( m xor-sum(S)=S_1 m xor S_2 m 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) ( m 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 eq 0),并且
      (circ) 整个 (a) 数组中只有 (a_i) 的第 (i) 个二进制位为 (1)
      (circ) (a_i) 更高的二进制位一定为 (0)
      (circ) (a_i) 更低的二进制位可能位 (1)

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

    证明

    显然特殊性质成立。

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

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

    合并

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

    暴力插入就完事了

    题目

    毛毛虫(没权限也看不了

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

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

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

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

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

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

    代码

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

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

  • 相关阅读:
    sqli-labs(十七)
    sqli-labs(十六)(order by注入)
    sqli-labs(十五)(堆叠注入)
    spring boot热部署
    java之定时任务
    python之字符串函数
    java加载配置文件信息
    python之运算符与基本数据类型
    python基础
    python介绍
  • 原文地址:https://www.cnblogs.com/-Iris-/p/15426100.html
Copyright © 2011-2022 走看看