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)

  • 相关阅读:
    Redis源码分析(二十一)--- anet网络通信的封装
    leetcode 总结part1
    leetcode String to Integer (atoi)
    leetcode 165. Compare Version Numbers
    leetcode 189. Rotate Array
    leetcode 168. Excel Sheet Column Title
    leetcode 155. Min Stack
    leetcode 228. Summary Ranges
    leetcode 204. Count Primes
    leetcode 6. ZigZag Conversion
  • 原文地址:https://www.cnblogs.com/-Iris-/p/15426100.html
Copyright © 2011-2022 走看看