题目链接
有一颗有根树,1为根节点,有这样的操作:我们给从1~x的节点染色成相同且未出现过的颜色,现在我们想知道u到v的简单路径上不同颜色的个数、或者u的子树下到根节点颜色数最多的颜色数是多少?
其实,我一开始没有往LCT想,但是它非要挂了个标签,于是开始想了,如果说我们将1号节点默认成根节点,并且是整棵LCT树上的根节点,那么,如果一开始将所有的节点看成是独立的Splay树上的节点,每棵Splay树上有且只有一个点。那么,颜色的个数,实际上就是它到根节点需要Access的次数,并且可以换一种表述的方式,如果Access了一次,那么它的子树中的节点(包括它本身)都要减少一个到1号节点的颜色种类数。
所以,我们可以利用LCT的Access操作来进行维护到根节点的颜色个数了,然后操作2、3便可以求得了。
操作1
在跳Access的时候要注意,我们要给原来的右儿子放逐,但是要去除它的贡献,又因为它是Splay过的,所以我们需要找到它的深度最浅的节点,也就是在Splay树上最左儿子的节点;同理,我们加上新的连接节点时候,也是需要对最浅的节点来对子树来更新的。
操作2
(+1是因为lca节点被多减去了一次);
操作3
查询子树信息即可。
Code
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include