LCA

RMQ LCA

O(nlogn) 预处理,O(1) 查询。空间 O(nlogn)

考虑欧拉序,设 dfn[u] 为点 u 在欧拉序中第一次出现的位置
不妨设 dfn[u]<dfn[v]lca(u,v) 即为 [dfn[u],dfn[v]] 中深度最小的点(也是 dfn 最小)
剩下的问题是静态 RMQ,ST 表解决

优化

做法来自 skip2004Alex_Wei

欧拉序长度是 2n1,但询问的端点只有 n 个,这为优化提供了可能

考虑相邻的两个端点 u,v(即“第一次 dfs 到”u 后第一个“第一次 dfs 到”的点是 v),我们希望知道 [dfn[u]+1,dfn[v]]dfn 最小的结点从而把这一段缩起来,下证这个点是 fa[v]

  1. uv 的祖先:一定有 u=fa[v],否则 u,v 之间的点都是“第一次 dfs 到”
  2. 否则:dfs 的过程一定是从 u 回溯到 lca(u,v),再一步走到 v

具体实现看代码比较好懂

posted @   ft61  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示