每周五篇博客:(3/5)
碎碎念
其实不是我想多水一篇博客,本来这篇是欧拉序的博客,结果dfs序也是可以O1求lca的,而且常数更优,结果就变成这样了。。。
前置知识
思想
分类讨论
对于查询的两个节点 u , v u, v u,v ,称两个节点的最近公共祖先为 l c a lca lca ,首先我们先确保 d f n u ≤ d f n v dfn_u \le dfn_v dfnu≤dfnv (这里的 d f n u dfn_u dfnu 表示 u u u 的dfs序,也是前置知识中的 l u l_u lu),如果 d f n u > d f n v dfn_u > dfn_v dfnu>dfnv 的话我们swap一下就可以
如果 u u u 是 v v v 的祖先节点的话,那么 l c a lca lca 一定是 u u u ,只需要判断下是否满足 d f n u ≤ d f n v dfn_u \le dfn_v dfnu≤dfnv(相当于 l u ≤ l v l_u \le l_v lu≤lv) 并且 r u ≥ r v r_u \ge r_v ru≥rv 即可
如果 u u u 不是 v v v 的祖先节点,并且我们保证了 d f n u ≤ d f n v dfn_u \le dfn_v dfnu≤dfnv 所以 u , v u, v u,v 一定在不同的子树中,例如

最低0.47元/天 解锁文章
744

被折叠的 条评论
为什么被折叠?



