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