擦肩而过的朋友,结伴而行的路人。
线性基
线性基是线性代数定义下的基底。一般而言,我们都拿二维平面向量来作比较。在高中数学的学习中,我们知道如何判断一组向量
那么同理,若现在存在一个向量集合
线性基可能不唯一,在线性代数中会使用,而
构造 & 实现
很显然,
对于当前已经得到的线性基集合
为了保证元素个数最少,我们要求线性基中任意两个元素的二进制最高位不能相同,这样的话,可以保证我们的集合大小在
考虑使这个不错的复杂度正确性成立,这意味着我们插入的元素一定是
考虑实现,用
参考实现
1 | ll Set[70]; //long long不过64位 |
性质
- 异或线性基不存在子集异或和为
; - 线性基不存在两个不同子集异或和相同;
- 线性基集合中任意元素的最高位不同;
例题 & 运用
最大异或和
首先考虑对
而对于之后的低位,我们只需要在当前答案上取
听说这道题还有一个
AC Code
1 | // ----- Eternally question----- |
子集异或和计数
题目简介
题目名称:
题目来源:
评测链接:https://codeforces.com/problemset/problem/895/C
形式化题意:给定一个长度为
数据范围:
如果多个数的乘积为完全平方数,从质因子的方向考虑,那么所有的质因子的出现次数都为偶数次。考虑到
但实际上,如果一个数要求出现次数为偶数,那一定有
根据线性基的定义,我们将
所以,要求异或和为
AC Code
1 | // ----- Eternally question----- |
子集异或和计数 II
题目简介
题目名称:
题目来源:
评测链接:https://codeforces.com/problemset/problem/959/F
形式化题意:给定
数据范围:
上面已经说到,异或和为
判断与插入同理,只是如果当前需要插入了则无解,而当
时间复杂度
AC Code
1 | // ----- Eternally question----- |
带标号线性基
题目简介
题目名称:元素
题目来源:
评测链接:https://www.luogu.com.cn/problem/P4570
形式化题意:给定
数据范围:
考虑这个
然后讲带标号,实际就是记录一个当前位的线性基对应的原序列编号,开个数组
AC Code
1 | // ----- Eternally question----- |
线性基合并
题目简介
题目名称:
题目来源:洛谷
评测链接:https://www.luogu.com.cn/problem/P4839
形式化题意:给定
- 向第
个集合中插入 ; - 求第
到 个集合的并的子集的最大异或和。
数据范围:
发现是一个单点修区间查的形式,所以多半可以用线段树维护。问题在于怎么维护,我们可以考虑在每个线段树结点上开一个线性基,然后每次查询把需要用到的
线性基的合并非常暴力,合并
AC Code
1 | // ----- Eternally question----- |
前缀线性基
题目简介
题目名称:
题目来源:
评测链接:https://codeforces.com/problemset/problem/1100/F
形式化题意:给定
数据范围:
直接上手线段树合并线性基,你发现
于是就有人上手猫树分治合并线性基,可以做到 lxl
分块
前缀线性基,可以在
考虑带标号的形式,我们对每一位记录
而对于询问,只需要考虑所有
AC Code
1 | // ----- Eternally question----- |
线性基合并 II
题目简介
题目名称:无力回天
题目来源:
评测链接:https://www.luogu.com.cn/problem/P5607
形式化题意:给定一个长度为
- 对区间
执行 ; - 选取区间
内的一个子序列求与 的最大异或和。
数据范围:
正解可以看
因为异或有一个优美的差分性子(
AC Code
1 | // ----- Eternally question----- |
线性基合并 III
题目简介
题目名称:幸运数字
题目来源:四川省选
评测链接:https://www.luogu.com.cn/problem/P3292
形式化题意:给定一棵
数据范围:
时空限制:
大家好,我是大常数暴力选手,所以我用树剖过了这道题。
考虑最暴力的方式就是通过树剖维护线段树,然后线段树结点维护线性基,可以做到
然后考虑并不带修,所以用倍增代替树剖可以优化掉查询的一支
离线拆贡献用猫树分治合并可以做到
在线做法有维护深度前缀线性基,也可以做到
写的树剖,其它做法居然还要动脑子,真的大受震撼(不是。
AC Code
1 | // ----- Eternally question----- |