Loading

CF208E Blood Cousins - 树

题意

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

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

题解

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

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

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

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

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

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

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

posted @ 2021-06-19 11:27  Alan_Zhao_2007  阅读(29)  评论(0编辑  收藏  举报