“回答所有静态 RMQ。下面先解决相邻差恒为 $\pm1$ 的深度数组,再通过 RMQ–LCA 等价归约处理一般数组。”
LCA 到 ±1 RMQ ​
对根树做完整树上 Euler 序:进入或返回一个顶点都记录该顶点与深度,得到顶点序列
因为从
RMQ 到 LCA ​
给数组
区间最小位置必须是端点在 Cartesian tree 中的最低共同祖先;否则中序区间或堆序会矛盾。Cartesian tree 可用单调栈在线性时间构造。
小树图像与约定 ​
根
边界与消歧 ​
两问题不是定义相同,而是在静态模型中线性互归约。LCA 方向产生特殊的 ±1 RMQ,Four Russians 可利用这一点;反方向则用一般数组的 Cartesian tree。重复最小值必须固定选最左或最右,且全链保持一致。点更新会改变 Cartesian tree,静态等价不直接给动态
线性构建细节 ​
Euler tour 必须记录每次沿边下行和返回,若只记录 preorder,两个节点首次出现区间的最低深度未必经过 LCA。first 数组在首次写入后不再覆盖;查询若
Cartesian tree 用单调递增栈扫描数组:弹出所有比当前值大的位置,最后弹出者成为当前左子,当前成为栈顶右子。每位置进出栈一次,构建
端点与重复最小值 ​
设 Euler 深度片段为
归约的成本也要分开记:Euler 序把
参考资料
- Michael Bender, Martin Farach-Colton, The LCA Problem Revisited, LATIN, 2000.
- Dov Harel, Robert Tarjan, Fast Algorithms for Finding Nearest Common Ancestors, SIAM J. Comput., 1984.