题目
正解
这题也不是给人写出来的……
先不要考虑操作二。
有一种比较新奇的思路:将点的颜色挂在边上,然后搞出个边的连通块。
这些连通块的维护是很舒服的,直接上数据结构即可。
考虑边的连通块和点的连通块的关系。
假如有
x
x
x和
y
y
y和
z
z
z三个点相连,
x
x
x为
y
y
y父亲,
y
y
y为
z
z
z父亲。
(
x
,
y
)
(x,y)
(x,y)和
(
y
,
z
)
(y,z)
(y,z)的颜色相同,意味着
y
y
y和
z
z
z的颜色相同。
推广一下,我们可以发现,对于一个边连通块而言,除了根节点(需要特判是不是整棵树的根节点),其它的点的颜色都相同。
既然这个性质这么优美,操作一和操作三就可以轻松解决了。
接下来考虑操作二。
发现这题似乎没有必要用LCT,因为LCT注重维护链上的东西,而这题不需要。这题也没有必要换根。所以用ETT更加简洁一些。
考虑将一个连通块变色之后的影响。最主要的是,我们要判断变色之后,有哪些原来跟它相连的连通块可以和它合并。
假如我们能够暴力地将这些连通块一个个找出来,然后连在一起。势能分析得到,连接的次数是
O
(
n
)
O(n)
O(n)级别的。
为了找到这些连通块,就要能够精准打击,每次找都会有结果。ETT的splay上对于一棵子树维护信息:对于每种颜色,是否有别的连通块连向区间内的点的边是这个颜色。同时,也对每棵点记录连向它的每种颜色的边分别有哪些。
乱搞即可……
总结
还是没代码啊……
将点权变成边权,这个套路很新颖,似乎在许多地方可以用得上。