THUPC2019 找树
定义一个二进制运算 (oplus) 为每一位上执行 (mathbf{or}/mathbf{and}/mathbf{xor}),具体每一位的操作给定。
给定一张 (n) 个点 (m) 条边的无向图,求一棵生成树,最大化边权的 (oplus) 和。
(nle 70,wle 12,mle 5000)
其中 (w) 为二进制位数。
Solution
感觉见过的套路再见面就比较简单了。
考虑矩阵树定理,每条边定义为一个 FWT 多项式 (x^{w_i}),那么用矩阵树定理求解即可。
注意到 FWT 是线性变换,可以先把所有元素 FWT,然后再对每个维度跑矩阵树,然后再 IFWT 回来即可,判定即为最大的 (k) 使得这种值存在。
当然,FWT 对于每一位不同也是可以做的。
复杂度为 (mathcal O(n^2(n2^w+w2^w)))
请提醒我联赛后记得写代码。