[unknown source] 快乐树
一、题目
题目描述
有一棵 \(n\) 个节点的数,每个点有点权 \(a_i\),定义一条路径的权值为路径上所有点的异或和,求所有路径的权值和,有 \(q\) 次修改,每次改一个点的点权。
数据范围
\(n,q\leq10000,a_i<2^{15}\)
二、解法
不难想到可以拆位,也就是对于每个二进制位分别考虑。
树上路径问题一定要往点分治方面想,然后由于有修改所以可以使用__点分树__
一开始陷入了错误的思路,因为点分树和原树的结构是不同的,所以直接记到根为 \(0/1\) 有多少条路径是难以维护的,因为我们要改经过被修改点的路径。这时候不妨考虑一些更加暴力的做法。
点分树是和线段树很搭的,对于每个分治中心都暴力建立其子树的线段树,每次修改都暴力跳点分树上的父亲,那么你就会发现修改是一段连续的区间,所以用线段树来区间修改是很容易的,维护一个翻转标记就可以了。
算答案就容斥一下,时间复杂度 \(O(n\log^2n\log c)\),暂时还没有代码。