其他分享
首页 > 其他分享> > CF208E Blood Cousins - 树

CF208E Blood Cousins - 树

作者:互联网

题意

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

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

题解

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

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

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

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

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

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

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

标签:10,祖先,Cousins,询问,dfs,Blood,深度,某个,CF208E
来源: https://www.cnblogs.com/alan-zhao-2007/p/cf208e-sol.html