首页 > 其他分享 >【复健】LCA复健笔记

【复健】LCA复健笔记

时间:2024-07-31 15:57:01浏览次数:11  
标签:复健 int ll LCA 笔记 深度 倍增

LCA 复健笔记

image

展开目录

目录

什么是 LCA

最近公共祖先/最深公共祖先,顾名思义,两个点的公共祖先中离它们最近/深度最大的那个。

怎么求 LCA

这里使用倍增优化算法,因为之前看不懂所以我觉得应该补一下(现在也看不懂。)。

暴力求 LCA

不停向上搜索,直到两点合为一点。

展开代码
int LCA(int x, int y) {
    if(d[x] < d[y]) swap(x, y); // 保持 x 的深度大于等于 y
    while(d[x] != d[y]) x = F[x];
	while(x != y) x = F[x], y = F[y];
	return x;
}

倍增优化

显然,在大部分使用 LCA 的情景中,上面的暴力做法会超时。

倍增是一个经常会使用到的优化(比如 \(ST\) 表),核心思想就是把搜索的步长从 \(1\) 变到 \(2^k\).

f[i][j] 代表节点 \(i\) 向上搜索 \(2^j\) 层后到达的点。有递推式:

f[i][j] = f[f[i][j - 1]][j - 1]

根据数学原理,从第 \(i\) 个点向上搜 \(2^{j - 1}\) 层后再搜 \(2^{j - 1}\) 层相当于搜了 \(2^j\) 层。

于是我们得到了搜索的底层逻辑:

将深度较大的一方上移,直到该方深度小于另一方,接着将两点一同上移直到两点只合为一点。

展开代码
inline int lca(ll x, ll y) {
	if(d[x] < d[y]) swap(x, y);
	for(int i = LogN; i >= 0; --i) if(d[f[x][i]] >= d[y]) x = f[x][i];
	if(x == y) return x;
	for(int i = l[n]; i >= 0; --i) if(f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];
	return f[x][0];
}

接下来思考如何初始化。

一个点的深度是它父亲节点的深度 \(+1\).

此外,根据刚才的递推式也可以计算出 \(f\) 数组的值。递推上界到 \(\log{n}\) 就可以了。

于是有递归初始化。

展开代码
void init(ll u, ll fa) {
	d[u] = d[fa] + 1;
	for(int i = 1; i <= LogN; ++i) {
		if((1 << i) >= d[u]) break;
		f[u][i] = f[f[u][i - 1]][i - 1];
	}
	for(int i = head[u]; i; i = nxt[i]) {
		int v = to[i];
		if(v == fa) continue;
		f[v][0] = u;
		init(v, u);
	}
}

应用场景

你需要求两个(或多个)点的公共祖先,但值域很大。

不适合的应用场景

Type This

标签:复健,int,ll,LCA,笔记,深度,倍增
From: https://www.cnblogs.com/Kiichi/p/18334833/LCAfujian

相关文章

  • 服务注册中心+配置中心-Nacos-微服务核心组件【分布式微服务笔记07】
    服务注册中心+配置中心-Nacos-微服务核心组件【分布式微服务笔记07】服务注册中心+配置中心-NacosNacos有两大功能:注册中心[替代Eureka]+配置中心[替代Config]架构理论基础:CAP理论(支持AP【高可用、分区容错性】和CP【分区容错性和数据一致性】,可以切换)Nacos结构......
  • 【学习笔记】Matlab和python双语言的学习(主成分分析法)
    文章目录前言一、主成分分析法1.主成分分析法简介2.主成分分析法原理3.主成分分析法思想4.PCA的计算步骤二、代码实现----Matlab三、代码实现----python总结前言通过模型算法,熟练对Matlab和python的应用。学习视频链接:https://www.bilibili.com/video/BV1EK41187......
  • git学习笔记1
    记录学习过程:git是如何运行工作的,先把文件从工作区传输到暂存区,之后再从暂存区传输到本地仓库git仓库的初始化,在需要的文件夹中右键鼠标"OpenGitBashHere",然后输入gitinit:git把文件先存放到暂存区之后git才能把文件存放到本地仓库可以查看当前git文件的状态,如果在......
  • Living-Dream 系列笔记 第70期
    登神长阶!P1272&P1273请查阅往期笔记,此处不再赘述。其中P1273我们学到了定义更好求解的状态(一般是转化为价值,如本题),再通过枚举求解最终答案。P8625容易发现你选出的\(S\)一定是一个子树。然后这题就变成最大子树和了。关于最大子树和那题,请查阅往期笔记,此处不再赘述。......
  • FreeRtos笔记1
    记录学习过程:了解简单的Arm架构,CPU中各种寄存器的作用:堆的含义(就是空闲的内存),堆的作用是用来管理这些内存(堆函数,链表):内存的栈-->每个任务都有独属于自己的栈,在自己的任务栈中会保存函数,局部变量,还有自己的现场:任务是如何进行的:任务的调度过程:......
  • 构造做题笔记
    UOJ460新年的拯救计划\(n\)点完全图。选出尽量多生成树。输出方案。\(n\le1000\)。考虑上界,总共有\(\frac{n(n-1)}{2}\)条边,也就是最多可以分成\(\frac{n}{2}\)棵树。尝试证明这个上界可以达到。我们考虑归纳法,假设\(n=2k\)可行。考虑\(2k+1\),我们可以将每棵生......
  • 学习笔记 String类案例练习 1.模拟用户登录 2.统计字符串英文字母大小写及数字个数
    目录案例一模拟用户登录需求:代码: 案例二统计字符串英文字母大小写及数字个数需求:代码:案例一模拟用户登录需求:已知正确的用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录之后,给出相应的提示代码:publicstaticvoidmain(String[]args){......
  • 华南理工大学线性代数笔记整理5——特征值与特征向量
    本人华工21级电信本科生,目前大四,前段时间收拾书本时发现了自己保存完整的线代笔记和一些整理,应该会对大一新生的期末考试起作用,故作分享。注:大一时本人都是用手写A4纸的方式做笔记做复习,所以这里上传的都是一些纸质笔记的扫描件,尽量可以保证清晰。以分章节的方式,本章为第5章......
  • 华南理工大学线性代数笔记整理4——线性方程组
    本人华工21级电信本科生,目前大四,前段时间收拾书本时发现了自己保存完整的线代笔记和一些整理,应该会对大一新生的期末考试起作用,故作分享。注:大一时本人都是用手写A4纸的方式做笔记做复习,所以这里上传的都是一些纸质笔记的扫描件,尽量可以保证清晰。以分章节的方式,本章为第4章......
  • 海康ID2013扫码枪调试笔记
    1,将电脑IP设置为自动获取2,修改IP3,点击刷新,连接扫码枪 4,自动工作模式设置 5,图像配置 6,算法配置 7,输入输出 8,  ......