1 线性基练习题

我更喜欢的是研究东西的乐趣。

老年选手写不了代码了。悲。


如何构造的

理解这个对做题非常有帮助的。

假设插入一个 w 维向量 x(可以试做一个二进制下的 01 集合),我们的基每个位置有基底 bi(是一个 w 维向量)。我们希望把 x 融入 b 中来表示更多的数。

从高到低位,如果这一位上 x 存在,那么如果这一位本来有基底了,说明此时表示重复,将 x 异或 bi。否则直接加入基,结束。

如果到最后都没有成功插入,说明 x 已经可以被当前线性基表示。

性质一:最高位 1 的位置互不相同。 这是根据上面的构造方法得出的。

性质二:任意一个可以用这些基底组合出的向量 x,组合方式唯一。

性质三:线性基的任意一个子集异或和不为 0。否则不会插入。


CF895C Square Subsets

对于数组 a,求从中间选择非空子集,使它们的乘积等于某个整数的平方的方法的数量。n105,1ai70

平方有个经典套路就是分解质因数,每个指数都是偶数。

假设所有 ai 先不同。并且每个指数都保留 0/1。显然我们需要凑出偶数个 1。也就是异或和为 0。(这里线性基的大小是 30 左右)

可以依次插入线性基,然后判断 insert 是否失败,如果失败说明可以凑出。但是我们现在是计数。

很容易发现可以构造一组基来表示出所有剩下的数,并且钦定所有构造的数都选。其余数任意选。证明是很容易的,考虑每次插入占据一位。所以基的大小也是唯一的。又根据性质三知道选的数里面选子集凑不出合法的。

P4151 [WC2011] 最大XOR和路径

题意: 求从 1n 经过所有边边权异或和最大的路径。

很经典的套路。但是证明不是那么简单。我不会证。

路径上有很多个环十分难办。(你可以走多次抵消这条边的贡献)因为没有好办法都构造出来。此时可以用线性基来表示。

求一个根为 1 的生成树,每次遇到返祖边就把当前这个环的异或和插入基中。

注意,这样并没有表示所有的环。只是说找出了所有需要我们需要的环。

最后的问题就是求 disn 和线性基的最大异或了。

P10682 [COTS 2024] 奇偶南瓜 Tikvani

和上面的非常像,但是是对于所有路径,所以首先先每个点跑一颗生成树。这样就搞出所有的环了。(注意本来环的数量是指数级别)

现在相当于是让每个环异或和都是 0。

我们可以记录上 dfs 树中每个环的元素下标,标记这些环。然后就是要计数。

结论:满足异或方程的解个数为 2nkk 为其线性基的大小(或者矩阵的秩)。

P4839 P 哥的桶

单点插入;查询区间最大异或和。n5×104

感觉有离线做法。但是我们可以线段树维护线性基。唯一的问题:线性基怎么合并。

非常简单,插入其中一个基的所有基底即可。复杂度是平方的。

所以整体复杂度 3log。

CF1100F Ivan and Burgers

上一题的加强版。只查询区间最大异或和。n5×105

线段树死亡。可以持久化吗?让我研究一下,主要是差分结构怎么搞。

考虑时间轴。现在相当于是要求我们基底的下标都尽可能靠右。

posted @   LCat90  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示