题意
有一棵 n n n个点的数,每个点有一种颜色。定义 y y y被 x x x支配当且仅当不存在 z z z满足 d i s ( x , z ) = d i s ( x , y ) dis(x,z)=dis(x,y) dis(x,z)=dis(x,y)。对于每个点,求出所有被他支配的点中有多少种不同的颜色。
n ≤ 300000 n\le300000 n≤300000
分析
先把直径求出来,对于一个点,被他支配的点一定在他到直径两端点中离他较远的那个点的路径上。
设直径两端点为 s s s和 t t t,以 s s s和 t t t分别为根做一次。
先把树长链剖分,然后在dfs时用一个栈记录该点到根路径上可能作为答案的点。
处理到一个点时,先把栈中和他距离不大于深度最大的轻儿子的点退栈,然后递归重儿子;接着把栈中和他距离不大于重儿子的点退栈,然后处理该点的答案并递归所有轻儿子。
注意每次递归儿子前都要先把该点入栈,用一个全局的桶维护答案即可。
时间复杂度 O ( n ) O(n) O