RMQ求LCA

RMQ求LCA

用RMQ可以实现O(n)求树上两点的LCA。 
记录一个S数组,每次DFS到某个点的时候就加入S数组,“到”并不是指DFS那种第一次“到”,是每次都加入。可以证明最终S数组内会有2n+1个数。 
再记一个数组PPi表示Si在树中的深度是Pi。 
举个栗子: 

然后记Firsti表示i结点在S中第一次出现的位置。 
对于一个询问(x,y),它们的LCA就是[Firstx,Firsty]中深度最小的结点。 
正确性:[Firstx,Firsty]中深度小于x,y的点都在xy的路径上,而深度最小的那个点就必然是LCA了。

posted @ 2017-08-28 15:02  沐灵_hh  阅读(346)  评论(0编辑  收藏  举报