CF208E Blood Cousins

题意

给你一片森林,每次询问某个点与多少个点有相同的 (k) 级祖先。

点数、询问数 (le 10^5)

题解

将所有树的根节点连向点 (0),使得整个森林变成一棵树。

先离线地求出每个询问点的 (k) 级祖先。用栈维护每个点到点 (0) 的路径上的所有点,那么其 (k) 级祖先就是这些点中的第 (k) 个。

那么问题就变成了:每次询问某个点有多少个距离它 (k) 条边的儿子。

这就很好做了,处理出来这棵树的 dfs 序以后,就转化成了问某段区间内深度为某个数的点有多少个。

因为深度一定不会超过 (10^5),所以对于每种深度都开一个 vector,从小到大记录 dfs 序,询问时二分一下即可。

用可持久化权值线段树也能做到同样的事情,而且它对值域大小没有限制。

感觉这题还挺简单的,所以没写代码。

Written by Alan_Zhao
原文地址:https://www.cnblogs.com/alan-zhao-2007/p/cf208e-sol.html