三月做题集

CF2194F2 Again Trees... (hard version)

tag:dp、树形 dp、状压 dp、集合幂级数、FWT。

difficulty:中。

先构建 \(b\) 的线性基 \(P\),记其大小为 \(m\),以下讨论中 \(b,aS\) 数组都是其实际值关于 \(P\) 的线性组合。这样的好处是同一实际值唯一对应一个状态。

F1 的做法是设 \(f_{u,S}\) 表示 \(u\) 子树内已确定的连通块异或和为 \(S\)。设 \(aS_u\)\(u\) 子树 \(a\) 异或和。转移时,另记数组 \(g\) 做异或卷积,有 \(g=\oplus_{v\in son_u} f_v\),然后 \(f_{u,S}\gets g_S+\sum\limits_{(aS_u\oplus T)\in b} g_T\),分别表示是否断父边。求解答案用 \(f_{u,aS_1}\) 减去 \(g_{aS_1}\) 即可。

暴力卷积复杂度 \(O(4^mn)\),用 FWT 直接优化复杂度 \(O(m2^mn)\) 还是过不去。

考虑直接维护 \(FWT(f)\),异或卷积按位相乘即可,然后我们需要求 \(\sum\limits_{(aS_u\oplus T)\in b} g_T\),考虑将其写成异或卷积的形式,记数组 \(ok_S=[S\in b]\)

\[\sum\limits_{(aS_u\oplus T)\in b} g_T=IFWT(FWT(\sum\limits_{(aS_u\oplus T)\in b} g_T)) \]

\[=IFWT(FWT((g\oplus ok)[x^{aS_u}])) \]

\[=\frac 1{2^m}\sum\limits_{S} (-1)^{|S\cap aS_u|} FWT(g)[x^S]FWT(ok)[x^S] \]

提前处理出 \(FWT(ok)\) 可以做到 \(O(2^m)\),然后你还要维护单点加后 FWT 数组的变化,利用线性性对每项贡献即可,也是 \(O(2^m)\)。总复杂度 \(O(2^mn)\)

总结:

  • 涉及异或卷积的 dp 转移,每次都 FWT 再 IFWT 回去可能是没必要的,可以考虑直接维护 FWT(dp)。
posted @ 2026-03-01 20:32  Zwi  阅读(0)  评论(0)    收藏  举报