我想这个大概可以算是某种树上分块吧(
看到这种题,看到数据范围,就要优先考虑 bitset(
那么也就是说需要求出 q 条链的 bitset。
链上问题优先考虑树剖,但是看起来树剖复杂度是假的(
那么,类比序列上的分块,就有了一个想法:
选取 O(√n) 个关键点,预处理出两两关键点之间的 bitset,然后每次从两边往 LCA 跳并利用预处理的 bitset 优化这一段的复杂度。
那么关键点怎么选呢?容易想到贪心地按深度从大到小考虑每个点,以其子树内每个点到最近的关键点的距离来决定这个点是否为关键点。
然而这样貌似很麻烦,我也不想写个 DS 题还得打个如此复杂的树形 DP(
所以,可以直接随机选取关键点,复杂度也是对的(
代码:
1 |
|