然而x、y一定在以LCA(x,y)为根的子树当中,所以这也是成立的。 具体怎么做? 首先,用dfsO(n)求出dfs序、r数组和deep数组。 然后,套一个纯的ST(RMQ)。设f[i][j]表示j~j+2^i-1的点当中,deep值最小的是哪个。 预处理做完了,接下来就可以在线O(1)回答询问了。 注意事项 这个dfs序长度是2n-1的,原因:每个点经过的次数=
所以我们只需要查询到区间[dfnu,dfnv]最小的节点的父亲,就可以找到lca了 关于区间查询,因为是静态查询并不涉及到修改操作,所以我们可以使用RMQ算法来实现O(n\log n)的预处理以及O(1)的单次查询 而关于维护RMQ的预处理,我们定义min_{j, i}表示dfs序中[i, i + 2^j]区间内深度最浅的节点的编号,所以初始...