一棵有 N 个点的树, 1 号点为根。一开始每个点有各自不同的一种颜色,一个点 u 的权值定义为 u 到 1 的路径上经过的点的不同的颜色种数。 Q 次操作,每次操作为以下两种之一:
1.q 输入点 u ,询问以点 u 为根的子树中所有点的平均权值。
2.O 输入点 u ,将点 u 到树根 1 路径上的所有点染成同一种之前未出现过的颜色。
N,Q≤150000
注意到树的形态并不会改变,那我们可以先弄出 dfs 序,方便对一个子树进行维护。接下来考虑怎样修改答案。
我们仔细观察 O 操作,联想一下 LCT 的 access 操作。每次染色,我们可以看成 access(u) 操作,不在同一 Auxiliary Tree 的节点颜色不同。而且,我们能发现,当且仅当一条边虚实切换(虚边变实边或实边变虚边)时,它连接的深度较大的节点的子树才会受影响。具体是:虚边变实边时,该子树内所有节点的权值 −1 ;实边变虚边时,该子树内所有节点的权值 +1 。我们用线段树维护就行了。