求 LCA 方法总结
求 LCA 方法总结
前言
求 LCA 是十分基础的东西,但是方法众多。此篇介绍 OI 中常用的求法。
倍增求 LCA
蒟蒻最先学的求 LCA 方法就是倍增求 LCA。预处理和查询时间复杂度均为单 \(\log\)。优点为好理解,比较简单,且便于处理路径数据。
树剖 LCA
重链剖分。优点是预处理是线性复杂度,单次查询单 \(\log\) 但常数较小。且套线段树就可以方便地处理很多信息。
大致过程
先做重链剖分。求 \(lca(u,v)\),若 \(u,v\) 在同一条链上,深度较大的那个点就是答案,否则跳离链头较远的点。
dfs 序求 LCA
参考这篇博客。
将 DFS 序求 LCA 发扬光大,让欧拉序求 LCA 成为时代的眼泪!
预处理使用 st 表,时间单 \(\log\),但是比欧拉序少一半常数,空间也少一半常数。
大致过程
st 表处理区间父亲深度最小的结点的父亲编号。询问的时候,若 \(u=v\),需要特判。否则设 \(dfn_u < dfn_v\),返回时间戳在 \(dfn_u+1 \sim dfn_v\) 的结点中父亲深度最小的结点的父亲编号。正确性详见上面提到的博客。
code
void dfs(int u,int fa) {
dfn[u]=++dfn0;
st[0][dfn0]=f;
for(int v : to[u]) if(v^f) dfs(v,u);
}
int lcamin(int a,int b) { return dfn[a]<dfn[b] ? a : b; }
int getlca(int a,int b) {
if(a==b) return a;
int mn=min(dfn[a],dfn[b])+1,mx=max(dfn[a],dfn[b]);
int k=__lg(mx-mn+1);
return lcamin(st[k][mn],st[k][mx-(1<<k)+1]);
}
求 LCA 方法总结的更多相关文章
- 求 LCA 的三种方法
(YYL: LCA 有三种求法, 你们都知道么?) (众神犇: 这哪里来的傻叉...) 1. 树上倍增 对于求 LCA, 最朴素的方法是"让两个点一起往上爬, 直到相遇", &qu ...
- 树上倍增求LCA(最近公共祖先)
前几天做faebdc学长出的模拟题,第三题最后要倍增来优化,在学长的讲解下,尝试的学习和编了一下倍增求LCA(我能说我其他方法也大会吗?..) 倍增求LCA: father[i][j]表示节点i往上跳 ...
- [算法]树上倍增求LCA
LCA指的是最近公共祖先(Least Common Ancestors),如下图所示: 4和5的LCA就是2 那怎么求呢?最粗暴的方法就是先dfs一次,处理出每个点的深度 然后把深度更深的那一个点(4 ...
- 树上倍增求LCA及例题
先瞎扯几句 树上倍增的经典应用是求两个节点的LCA 当然它的作用不仅限于求LCA,还可以维护节点的很多信息 求LCA的方法除了倍增之外,还有树链剖分.离线tarjan ,这两种日后再讲(众人:其实是你 ...
- BZOJ1906树上的蚂蚁&BZOJ3700发展城市——RMQ求LCA+树链的交
题目描述 众所周知,Hzwer学长是一名高富帅,他打算投入巨资发展一些小城市. Hzwer打算在城市中开N个宾馆,由于Hzwer非常壕,所以宾馆必须建在空中,但是这样就必须建立宾馆之间的连接通道.机智 ...
- 详解使用 Tarjan 求 LCA 问题(图解)
LCA问题有多种求法,例如倍增,Tarjan. 本篇博文讲解如何使用Tarjan求LCA. 如果你还不知道什么是LCA,没关系,本文会详细解释. 在本文中,因为我懒为方便理解,使用二叉树进行示范. L ...
- 倍增求lca(模板)
定义LCA,最近公共祖先,是指一棵树上两个节点的深度最大的公共祖先.也可以理解为两个节点之间的路径上深度最小的点.我们这里用了倍增的方法求了LCA.我们的基本的思路就是,用dfs遍历求出所有点的深度. ...
- tarjan算法求LCA
tarjan算法求LCA LCA(Least Common Ancestors)的意思是最近公共祖先,即在一棵树中,找出两节点最近的公共祖先. 这里我们使用tarjan算法离线算法解决这个问题. 离线 ...
- SPOJ 10628 Count on a tree(Tarjan离线 | RMQ-ST在线求LCA+主席树求树上第K小)
COT - Count on a tree #tree You are given a tree with N nodes.The tree nodes are numbered from 1 to ...
- 浅谈求lca
lca即最近公共祖先,求最近公共祖先的方法大概有3种,其实是窝只听说过3种,这3种做法分别是倍增求lca,树剖求lca和tarjan求lca,但是窝只会前2种,所以这里只说前2种算法了. 首先是倍增求 ...
随机推荐
- Restcloud ETL开箱即用-永久免费
2022年4月18日,国内领先的数据集成企业RestCloud发布了全新的ETL社区版本. RestCloud ETL社区版是一款完全国产化自主研发创新的全WEB化.开箱即用.永久免费的数据集成工具, ...
- Linux 给文件夹或者文件增加权限-九五小庞
chmod -R 777 文件夹 参数-R是递归的意思 777表示开放所有权限 chmod 777 test.sh chmod +x 某文件 如果给所有人添加可执行权限:chmod a+x 文件名 ...
- C++迭代器iterator详解
https://blog.csdn.net/QIANGWEIYUAN/article/details/89184546?utm_medium=distribute.pc_relevant.none-t ...
- InnoDB 磁盘结构
InnoDB的磁盘结构是一个分层.组织精密的体系,核心围绕着表空间(Tablespaces) 展开.它主要由以下几大部分组成: 核心思想:数据存储在表空间文件中! 表空间(Tabl ...
- postgres基本操作大全
首先切换到postgres用户 su - postgres -- 首先切换到postgres 常识:PG安装完后默认带有postgres库,可以先进入postgres库再去创建新库 1创建用户: po ...
- 文件服务(SMB)共享详解
三种共享类型: 微软的CIFS文件共享协议,可以让windows机器在网上邻居之间共享文件,也即是windows-windows之间的文件共享: NFS文件共享协议,可以让远程共享的共享目录挂载在本地 ...
- 修改Element Slider 滑块 label选中样式 (自定义 Elementui Slider 滑块 样式)
效果图: 1,加入slider滑块代码 <el-slider v-model="level" vertical :show-stops="true" :s ...
- LWIP TCP滑动窗口为TCP ZeroWindow的解决方法
最近做项目使用到LWIP, 板子当作客户端,PC机当作服务器,当板子和PC机通信一段时间后,板子就接收不到数据.抓包分析为: 发现经过一段时间通信后,滑动窗口大小越来越小,最终显示为TCP WINDO ...
- Java面向对象基础——2.构造方法
目录 Java构造方法 构造方法的基本概念与作用 为什么需要构造方法? 构造方法的定义与使用 基本语法 示例:为Person类定义构造方法 默认构造方法 注意事项 构造方法的重载 示例:重载构造方法 ...
- [题解]ABC347 C~E
Portal:https://atcoder.jp/contests/abc347/tasks ABC347只过了\(A,B\),再创新低,...遂来补题 C - Ideal Holidays 题意简 ...