小技巧之 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\) 子树)时的取值的差。

posted @ 2026-01-15 08:21  Zwi  阅读(2)  评论(0)    收藏  举报