1 线性基练习题

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

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


如何构造的

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

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

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

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

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

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

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


CF895C Square Subsets

对于数组 \(a\),求从中间选择非空子集,使它们的乘积等于某个整数的平方的方法的数量。\(n\le 10^5,1\le a_i\le 70\)

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

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

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

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

P4151 [WC2011] 最大XOR和路径

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

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

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

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

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

最后的问题就是求 \(dis_n\) 和线性基的最大异或了。

P10682 [COTS 2024] 奇偶南瓜 Tikvani

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

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

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

结论:满足异或方程的解个数为 \(2^{n-k}\)\(k\) 为其线性基的大小(或者矩阵的秩)。

P4839 P 哥的桶

单点插入;查询区间最大异或和。\(n\le 5\times 10^4\)

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

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

所以整体复杂度 3log。

CF1100F Ivan and Burgers

上一题的加强版。只查询区间最大异或和。\(n\le 5\times 10^5\)

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

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

posted @ 2024-12-07 21:17  LCat90  阅读(59)  评论(0)    收藏  举报