线性基

线性基

定义:给定数集 S ,以异或运算张成的数集与 S 相同的极大线性无关集,称为原数集的一个线性基。

性质:

  • 原数集的任意数均可通过线性基异或得到。
  • 线性基里任意一个子集异或和非 0
  • 一个数集可能有多个线性基,但是线性基大小唯一,且是满足性质一是大小最小的。
  • 值域为 V 的数集的线性基大小上界为 logV

基本操作

P3812 【模板】线性基

记数组 p 表示数集的线性基,钦定若 pi 有值则 pi 的第 i 位为 1>i 的位为 0

插入、查询存在性

从高到低枚举 k 的每一位,判断 pi 这个位置是否有数,没有就插入并退出,否则将 k 异或上 pi 继续判断(把最高位不断消掉)。

如果没有成功插入这个数,则说明这个数可以被线性基表示,无需插入。

时间复杂度 O(logV) ,不难发现插入操作同时可以用于查询一个数是否能被线性基表示。

求子集与某数的异或最值

因为低位不会影响高位,直接从线性基的最高位开始贪心即可,时间复杂度 O(logV)

求数集异或最值

异或最大值直接调用 querymax(0) 即可。

异或最小值一般就是线性基里的最小元素,因为插入这个元素的时候我们总是尽量让它的高位全消掉才来插入这一位。

需要特判原数集存在子集异或和为 0 的情况,时间复杂度 O(logV)

查询异或k小值

首先考虑,如果每一位的选择互不影响,那么将 k 二进制分解后选择即可。

但线性基不一定满足这个性质,于是考虑重新构造一个线性基。尽量把原来的线性基只留下最高位的 1 ,剩下的位都用小的基底消掉,从而使得线性基中的数的异或值不会相互影响。

时间复杂度 O(log2V)

查询排名

不难理解。

求并

A 的每个元素插入 B 即可,时间复杂度 O(log2V)

求交

引理:若 V1,V2 是线性空间,B1,B2 是它们的一组基。令 W=B2V1 ,若 B1(B2W) 线性无关,则 WV1V2 的一组基。

证明:考虑对于任意 xV1V2 ,假设 x 不能被 W 表示,则 v 一定可以被 ST 表示,其中 SW,TB2W,T ,那么此时 TB1 一定线性相关,矛盾。

因此对于求 AB ,若 Bi 能被 A1xB1i1 表示,则把 i=1xAij=1i1Bj 加入交集的线性基中即可。

应用

基本应用

P4301 [CQOI2013] 新Nim游戏

n 堆石子,第 i 堆有 ai 个。第一回合双方可以任意拿走若干堆棋子,第二回合开始与传统 Nim 游戏一样,求先手必胜时第一回合拿走的最小石子数,或报告无解。

n100

若在第一回合拿走石子后,剩下的石子存在异或和为 0 的子集,那么对手保留这个子集则会造成先手必败的局面。

考虑贪心从大到小把数加入线性基,若插入失败则必须取走。

P4839 P 哥的桶

维护 n 个初始为空的集合,m 次操作:

  • 向某个集合插入一个数。
  • 查询一段区间集合并的子集异或最大值。

n,m5×104

线段树维护线性基区间集合并即可,时间复杂度 O((n+m)lognlog2V)

P11620 [Ynoi Easy Round 2025] TEST_34

维护数列 a1nm 次操作:

  • 将区间 [l,r] 中所有数异或 k
  • 求区间中所有子序列的异或和异或 v 的最大值。

n,m5×104

考虑引入差分数组 bi=j=1iai ,则区间修改可以转化为单点修改。

查询时注意到 alr 的线性基与 albl+1r 的线性基等价,因此只要合并两个线性基查询即可。

线段树维护即可做到 O(mlognlog2V)

UOJ698. 【候选队互测2022】枪打出头鸟

给定集合 S1nq 次询问,每次询问下标最小的不存在子集异或和为 k 的集合。

n105q106

Ai 表示 S1i 线性基的交集,则可以二分找到最小的不能表示 kAi 即为答案,时间复杂度 O(nlog2V+qlognlog2V) ,无法通过。

注意到后面的线性基是前面线性基的子线性基,考虑按照基底的消失时间建立一个新的线性基,每次查询这个新线性基中表示 k 的所有基底中第一个消失的即可。

时间复杂度 O(nlog2V+qlogV)

前缀线性基

CF1100F Ivan and Burgers

给定 a1nq 次询问从给出区间中选若干位置,最大化异或和。

n,q5×105

若询问区间都是前缀,那么只要预处理所有前缀的线性基即可。

一个朴素的想法是用线段树查询区间的线性基,时间复杂度 O(nlog2V+qlognlog2V) ,无法通过。

思考询问非前缀的难点,发现有的位置在 [1,r] 时是有值的,而在 [l,r] 时没有值。

考虑维护所有前缀的线性基,但是每个位置的值均保留出现下标最靠后的。这样查询最大值时只要在 [1,r] 的线性基中查询该位置下标 l 的值的异或最大值即可。

时间复杂度 O((n+q)logV)

P4570 [BJWC2011] 元素

给出 n 个二元组 (xi,yi) ,需要选出若干元素满足任意一个子集的 x 异或和不为 0 ,求 y 的最大值。

n103

线性基模板,插入时尽量留下大的 y 即可。

P3292 [SCOI2016] 幸运数字

给出一棵包含 n 个点的树,q 次询问 maxVPath(x,y)xVax

n2×104q2×105

先将路径拆为两条到 LCA 的链。

使用线性基维护答案,对于每个线性基,贪心的让高位的向量对应的点深度尽量大,查询时只要查询深度合法的点即可。

时间复杂度 O(nlog2V)

图上异或边权环

P4151 [WC2011] 最大XOR和路径

给定一张带权无向图,求一条 1n 的路径(不一定是简单路径),最大化路径上边权异或和。

n5×104m105

注意到对于一个环,可以选整个环的边权异或和或不选,因为走到环和走回来边权会抵消。

先找出所有的环,由于这里的边权是异或的,因此只要将 dfs 树上一条返祖边与若干树边组成的环丢进线性基即可,可以证明任意一个环的边权异或和可以由这些环线性组合得到。

最后查询与任意一条合法路径的权值与所有环的子集的异或最大值即可,时间复杂度 O(nlogV)

类似的题(最大改最小):CF845G Shortest Path Problem?

CF724G Xor-matic Number of the Graph

给出一张无向带权图,三元组 (u,v,s) 合法当且仅当存在一条 uv 且权值异或和为 s 的路径(不一定要简单路径),求所有合法三元组 s 的和 mod109+7

n105m2×105

构建 dfs 树,则 uv 存在一条边权异或和为 disudisv 的路径。

先求出所有简单环的异或和丢到线性基里面,然后按位考虑贡献。

不妨设线性基大小为 siz 且当前位为 i,那么求出所有第 i 位为 01disu 的个数,分别记为 zo。这样就可以算出当前位异或起来为 01 的数对个数,即 cnt0=(z2)+(o2),cnt1=z×o

若线性基第 i 位有值,则线性基共异或出 2siz1 个第 i 位为 01 的数,贡献为 (cnt0+cnt1)×2siz1×2i 。否则线性基共能异或出 2siz 个第 i 位为 0 的数,贡献为 cnt1×2siz×2i

时间复杂度 O(nlogV)

挖掘线性基性质

P5556 圣剑护符

给定一棵树,点带点权,q 次操作:

  • x,y 间的简单路径上的所有点的点权异或上 z
  • 询问是否存在 A,BPath(x,y) 满足 ABxAvalx=xBvalx

n105

修改直接用树剖处理,查询实际上就是判断 P(x,y) 是否有点无法插入线性基。

注意到线性基元素最多 O(logV) 个,即若 |Path(x,y)|>logV 则必定有点无法插入,否则暴力判断即可。

时间复杂度 O(nlognlog2V)

CF959F Mahmoud and Ehab and yet another xor task

给定 a1nq 次询问前 a1l 中有多少子集异或和为 x ,答案对 109+7 取模。

n,q105

考虑取出 a1l 的线性基,若 x 不能被表示则答案为 0 。否则考虑不在线性基内的元素的数,这些数都可以被线性基异或为 0 ,都可以选或不选,于是答案即为 2lsiz ,其中 siz 表示线性基大小。

时间复杂度 O((n+m)logV)

P4869 albus就是要第一个出场

给定 a1n ,求 m 在所有 2n 个子集异或和的排名。

n105

a1n 的线性基大小为 siz ,则有 2siz 个不同的数,每个数出现了 2nsiz 次。

因此答案即为 m 在线性基中的排名乘上 2nsiz

CF1163E Magical Permutation

给出集合 S ,定义排列 p02x1 合法当且仅当排列中任意两个相邻的元素的异或值 S 。求 x 最大的一个合法排列。

|S|,Si2×105

首先有 xlog(maxS)+1 (否则一定有一对异或值有最高位,而 S 没有这个最高位),因此考虑枚举所有的 x 判断可行性。

猜测:一个 x 可行当且仅当 02x1 都可以表示为 S 的一个子集异或和,即 S<2x 的数组成的线性基大小为 x

必要性:找到排列中 0 的位置,向两边扩展即可证明。

充分性:只要构造一个排列即可。考虑求出 02x1 对应线性基的哪个子集,把这些子集按照选取方案用二进制表示为 02x1 。因为线性基的每个位置存的都是一个子集的异或和,问题转化为把 02x1(所有子集)重新排列,使得任意相邻两个数,只有一位二进制为不同,构造格雷码即可。

带删线性基

P3733 [HAOI2017] 八纵八横

给出一张 n 个点 m 条边的无向连通图,边带边权 wiq 次操作,操作有:

  • 在点 x,y 之间加入一条边权为 wi 的边。
  • 将第 k 条新边权值改为 wi
  • 删掉第 k 条新边,保证这条边之后不会再出现。

对于初始状态和每次操作后,从图中找到一条从 1 出发,并回到 1 的一条权值最大路径,路径权值定义为经过边边权的异或和。点边均可多次经过,边经过多次边权也会被计算多次。

n,m500q,logW103 ,加边操作不不超过 550

将问题分为三个部分:

  • 找到所有的环。
  • 计算所有环的异或最大值。
  • 对某个环的权值单点修改或删除某个环。

前两者是简单的,直接带权并查集配合线性基维护即可。

考虑将删除操作转化为将这个环的权值异或到 0 ,这样走到这个环就没有贡献,就没有删边操作。问题转化为维护一个支持单点异或的集合的线性基。

考虑维护每一个数插入时被异或上的基底集合 csti ,假设现在单点修改 x

  • 找到一个不在线性基里面的数 i 并满足 xcsti ,如果找不到就贪心找最低的包含 x 的基底。

  • 然后用选出的这个数消去其它所有包含 x 的基底,这样就消去了线性基中 x 的影响。

  • 最后修改这个选出的基底,再插入线性基即可。

单次修改复杂度 O(n+logW)

记总共加入 x 条新边,则总时间复杂度为 O(nlogn+q(x+m+logW)logWω)

本文作者:wshcl

本文链接:https://www.cnblogs.com/wshcl/p/18710542/LinearBasis

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wshcl  阅读(7)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开