XorDistances

[ABC202E] Count Descendants

考虑一个判断某个点 \(v\) 是否为另一个点 \(u\) 后代的方法:令 \(dfn_v\) 表示 \(v\)\(dfs\) 序,令 \(out_u\) 表示离开 \(u\) 的子树时的最新的 \(dfs\) 序,由于一个子树内的 \(dfs\) 序是连续的,所以只要 \(dfn_u\le dfn_v\le out_u\)

考虑将深度同一层的点按照 \(dfs\) 序为权值放到数组中,然后每次对于 \(D\) 层,二分找在 \(dfn_u,out_u\) 之间的点数即可。

复杂度 \(O(q\log n)\)

还有一种解法,我们可以将每个点的深度按照 \(dfs\) 序为下标放到一个数组里,然后每次查询的就是一段区间内等于某个数的个数。可以考虑莫队,复杂度 \(O(n\sqrt q)\)

代码二分

代码分块

posted @ 2023-08-01 18:36  wscqwq  阅读(15)  评论(0编辑  收藏  举报