P7518 宝石

发布时间 2023-07-27 20:28:04作者: Linnyx

[省选联考 2021 A/B 卷] 宝石

考虑将\(s\rightarrow t\)的路径拆为两个部分:

\(s\rightarrow lca(u,v)\quad lca(u,v)\rightarrow t\)

考虑维护两个数组

\(f_{u,j}\)表示\(p_u\)向上跳\(2^j\)个后继能跳到的位置

\(g_{u,j}\)表示\(p_u\)向上跳\(2^j\)个前驱能跳到的位置

二分一个答案mid,那么此时我们要找到一个离s最近的祖先\(p_1\)和离t最近的祖先\(p_{mid}\),开始倍增,dep不小于lca

还剩一个问题,如何快速求出离一个点最近的祖先\(p_x\)呢?

对于一个点来说,假设为u,\(p_u\)是他的颜色,那么他覆盖的区间是\([dfn_u,dfn_u+sz_u-1]\),我们现在假设要求离x最近的祖先\(p_k\),显而易见的是,可能满足要求的区间首先左端点比x小,这使得可能的区间构成一个前缀,而我们去二分这个区间,使其同时满足右端点也包含x

总时间复杂度:\(O(n\log^2 n)\)