题面:
题意:
给定一棵树,根节点为1,每个点有颜色和权值两个属性。
我有两种操作,更改某个点的颜色或者更改某个点的权值。
询问每次更改之后 ∑ c o l o r [ x ] = = c o l o r [ y ] a n d x , y 互 不 为 祖 先 v a l [ x ] x o r v a l [ y ] \sum\limits_{color[x]==color[y]\space and \space x,y互不为祖先}val[x]\space xor \space val[y] color[x]==color[y] and x,y互不为祖先∑val[x] xor val[y]。
题解:
对于每一种颜色的贡献都是独立的,所以我们可以枚举每种颜色对答案的贡献。
对于相同颜色的节点,每一位的贡献都是独立的,所以我们可以再去枚举每一位的贡献。
我们设 a n s [ i ] ans[i] ans[i] 为第 i i i 次修改后所要求的 s u m sum sum 的变化值。
那么我们最后再对 a n s [ i ] ans[i] ans[i] 求一遍前缀和即为答案。
考虑对于某一种颜色怎么维护这种颜色对 a n s [ i ] ans[i] ans[i] 的贡献。
我们将修改拆分为一次删除(某种颜色或者某个权值)和一次增加(某种颜色或者某个权值)。
考虑当前枚举到 c o l o r color color 颜色, 第 k k k 位, x x x 节点。
我们考虑这一次在 x x x 节点操作的贡献。
现在我们正在维护的颜色都是 c o l o r color color,正在搞第 k k k 位。
那么我们需要知道 不在 根节点到 x x x 节点上 ,不在 x x x 节点的子树中 的 0/1 的数量。
我们设 c = ( x > > k ) & 1 c=(x>>k)\And 1 c=(x>>k)&1,那么这一位的贡献就为:
a n s [ i d ] + = ( 1 < <