structedge{ int v,w; }; //思考:要想知道一个数有几个二级制位,直接n=__lg(x) //我们可以知道<n最近的2的次幂,9最大的是8,8虽然是2的3次方,但要遍历它的每一位 //需要3到0开始,也就是考虑到0的影响,我们可以正好满足偏移。 //2的3次方有四位,也就是__lg(x)就是我们需要的最高位,从它开始往低遍历 vector<edge>e[N]; int dep[N]; int d[N]; constint len=__lg(N); int f[N][len+2]; int cnt[N]; int ans=0; voiddfs(int u,int fa){ dep[u]=dep[fa]+1; f[u][0]=fa; for(int i=1;i<=len;i++)f[u][i]=f[f[u][i-1]][i-1]; //预处理倍增数组