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