P9745 「KDOI-06-S」树上异或 题解

发布时间 2023-10-19 20:45:08作者: FOX_konata

原题

  • 挺好的树形 dp ,正好 dp 不太熟练,练习一下
  • 赛时只想到了暴力和\(X \leq 7\) 的链的部分分,过于 naive 不说了
  • 先考虑链的情况,既然是二进制考虑按位拆分。设 \(g_{i,j,0/1}\) 表示以 \(i\) 为根,从 \(i\) 点连通块的疑惑和第 \(j\) 位为 \(0/1\) ,除去连通块部分的积的和。然后设 \(f_i\) 表示以 \(i\) 为根的答案。
  • 初始状态:若 \(a_u\) 的第 \(i\) 位为 \(1\) ,则 \(g_{u,i,1} = 1\) ,否则为 \(0\)
  • 对于每个儿子,枚举二进制下每位 \(i\) 转移

\[\begin{cases} g_{i,j,0} \leftarrow g_{i,j,0} \times (g_{i-1,j,0} + f_{i-1}) + g_{i,j,1} \times g_{i-1,j,1} \\ g_{i,j,1} \leftarrow g_{i,j,1} \times g_{i-1,j,0} + g_{i,j,1} \times (g_{i-1,j,0} + f_{i-1}) \\ f_{i} = \sum\limits_{j=0}^{63} 2^j \times g_{i,j,1} \end{cases} \]

  • 链是相对比较好理解的,然后考虑树的部分。
  • 同理的, dp 的定义和链相同,初始状态相同。对于每个儿子,枚举二进制下每位 \(i\) 转移

\[\begin{cases} g_{u,i,0} \leftarrow g_{u,i,0} \times (g_{v,i,0} + f_{v}) + g_{v,i,1} \times g_{v,i,1} \\ g_{v,i,1} \leftarrow g_{u,i,0} \times g_{v,i,1} + g_{u,i,1} \times (g_{v,i,0} + f_{v}) \\ f_{u} = \sum\limits_{i=0}^{63} 2^i \times g_{u,i,1} \end{cases} \]

最终复杂度 \(O(n \log X)\)