【题解】异或树
异或树
题目描述
有一棵 \(n\) 个节点的树,它的每一个节点有一个权值和特殊值。权值已知,特殊值是从该节点到根的异或和。整棵树的权值则为所有节点特殊值之和。求:找一个节点作为根,使得整棵树的权值最大。
思路
先分析任务:找一个节点作为根,使得整棵树的权值最大。因为涉及根,那这显然是一道换根DP。
再分析细节:异或和。这是一道与位运算(异或运算 ^ )有关的题。
而位运算有一个优点:运算结果的每一位仅与参与位运算的两个数中对应的那一位有关(每一位都是单独运算,不会互相干扰)
由于仅与一位有关系,那么简化问题,假设每一位权值只有 \(0\),\(1\) 两种情况:
那么,每一个节点的特殊值与从根到该节点路径上 \(1\) 的数量 \(cnt\) 的奇偶性有关:
- 当 \(cnt\) 为奇时,特殊值为 \(1\)
- 当 \(cnt\) 为偶时,特殊值为 \(0\)
最后的答案是树中特殊值为 \(1\) 的节点的数量。
最后是换根方程。
graph TB
1((u))
2((v))
3[usons]
4[vsons]
1---2
1---3
2---4
令 \(size_u\) 和 \(num_u\) 为以 \(u\) 为根的子树中节点的数量和特殊值为 \(1\) 的节点数量,\(dp_u\) 为答案(已知 \(dp_1\)),现在考虑转移:
- 当 \(a_v=1\) 时:
\[dp_v=dp_u-(num_u-num_v)+(size_u-size_v-(num_u-num_v))-num_v+(size_v-num_v);
\]
- 当 \(a_v\ne 1\) 时:没有变化
对每一个数位跑一遍,答案汇总就能得到最终答案

浙公网安备 33010602011771号