小技巧之 O(n) 求树上 k-son 和 k-father
posted on 2024-04-24 13:23:02 | under | source
搞不好将来会用到?
k-father
\(\rm dfs\) 时维护一个栈,表示 \(1\to u\) 路径上的点(不包括 \(u\))。
那么 \(u\) 的 \(k\) 级祖先就是栈顶向下第 \(k\) 个点了。
k-son
容易想到一个离线后树状数组的做法(和正解一点关系没有哈哈)。
更好的做法是 \(\rm dfs\) 时差分。我们用 \(buc_i\) 记录 \(dep_u=i\) 并被访问过的点的数量,那么 \(u\) 的 \(k\) 级儿子数量就是 \(buc_k\) 在刚访问 \(u\) 时的取值和准备离开 \(u\)(即访问完毕 \(u\) 子树)时的取值的差。

浙公网安备 33010602011771号