很有教育意义的树形DP,看起来很典,但我没见过
首先考虑链的情况,设 \(f_i\) 表示前 \(i\) 个点,所有删边方案中,所有联通块点权异或和的乘积的和,其实就是一个 \(\sum \prod\) 的形式,这样我们枚举最后一个连通块就可以转移了:\(f_i = \sum_{j<,i} f_j \times \oplus_{k=j+1}^i x_k\)。这样转移是 \(O(n)\) 的,总复杂度 \(O(n^2)\),考虑优化。
我们希望 \(O(1)\) 转移,上面的式子复杂度高,究其原因是需要枚举转移点,这样的跳跃式转移要避免,考虑连续地转移。
异或和其他运算没什么性质,直接拆位,设 \(g_{i,j,k}\) 表示包含 \(i\) 的连通块权值的第 \(j\) 位为 \(k\) 的所有方案中,不包含 \(i\) 的连通块权值的乘积的和。初始时若 \(x_i\) 第 \(j\) 位为 1,则 \(g_{i,j,1}=1\),否则 \(g_{i,j,0}=1\)。转移
\[g_{i,j,1} = g_{i,j,1}\times (g_{i-1,j,0}+f_{i-1})+g_{i,j,0}\times g_{i-1,j,1}
\]
\[g_{i,j,0} = g_{i,j,1}\times g_{i-1,j,1}+g_{i,j,0}\times (g_{i-1,j,1}+f_{i-1})
\]
\[f_i=\sum_{j=0}^{63}2^j\times g_{i,j,1}
\]
把这个搬到树上是一样的,答案是 \(f_1\)。
上面转移时要加 \(f_{i-1}\) 是因为 \(g_{i-1,j,k}\) 钦定了包含 \(i-1\),实际上不包含的也要算进去,这点在序列上看不出来,但在树上是很关键的,因为树上的连通块有多个分支,而序列上只有一个。