O(1)LCA

news/2024/10/5 11:20:27

大家常用的三种LCA算法如下:
倍增为在线,复杂度\(\Theta(n\log n)\)预处理,\(\Theta(\log n)\)查询。
树剖为在线,复杂度\(\Theta(n)\)预处理,\(\Theta(\log n)\)查询。
Tarjan为离线,\(\Theta(n+q)\)复杂度。

现在介绍\(\Theta(n\log n)\)时间预处理,\(\Theta(1)\)查询的在线LCA算法。
欧拉序:
其实就是前序遍历时每次回溯也加入序列当中。
[pkwAQ6P.png]
如图的欧拉序为
1 2 4 8 4 7 4 2 5 2 1 3 9 3 10 12 10 3 11 3 1
记录每个点第一次在欧拉序中出现的位置\(p_i\),如求LCA(5,10)
\(p_5\)\(p_{10}\)之间的序列为
5 2 1 3 9 3 10
其中LCA(5,10)=1的深度为要求序列中最小的。
其他的点也类似,于是可以用ST表来维护区间深度最小值。
欧拉序的长度为\(\Theta(n)\)的,于是预处理复杂度\(\Theta(n\log n)\),查询复杂度\(\Theta(1)\)
代码如下

const int N=500005;
int n,head[N],pedge,dfn[N],lg[N<<1],cnt,id[N<<1],dep[N],st[N<<1][20];
struct Edge{int to,next;
}edge[N<<1];
void ins(int u,int v){edge[++pedge]={v,head[u]},head[u]=pedge;
}
void dfs(int u,int father){dfn[u]=++cnt,id[cnt]=u,dep[u]=dep[father]+1;for(int e=head[u];e;e=edge[e].next)if(edge[e].to^father)dfs(edge[e].to,u),id[++cnt]=u;
}
void init(){//预处理dfs(s,0);lg[0]=-1;for(int i=1;i<=cnt;i++)st[i][0]=id[i],lg[i]=lg[i>>1]+1;for(int j=1;j<=19;j++)for(int i=1;cnt-i+1>=1<<j;i++){int f1=st[i][j-1],f2=st[i+(1<<j-1)][j-1];st[i][j]=dep[f1]<dep[f2]?f1:f2;}
}
int lca(int u,int v){//求lcau=dfn[u],v=dfn[v];if(u>v)u^=v^=u^=v;int k=lg[v-u+1],f1=st[u][k],f2=st[v-(1<<k)+1][k];return dep[f1]<dep[f2]?f1:f2;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/44025.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

CMU15445数据库系统笔记.18221501

本篇文章是CMU 15445数据库系统的学习笔记,持续更新... [课程视频 Fall 2021] | [课程主页]LEC03. 数据库存储结构(上) 分层设计概述 设计任何大型系统时的一个常用手段是分层,数据库系统也可以被分成若干层,每一层处理自己的事情,向上提供简单的API隐藏细节。举个例子,…

纪念一下

教程来自:2019ISCC_web题解 - oswords blog (zhzhdoai.github.io)

2024-06-15:用go语言,Alice 和 Bob 在一个环形草地上玩一个回合制游戏。 草地上分布着一些鲜花,其中 Alice 到 Bob 之间顺时针方向有 x 朵鲜花,逆时针方向有 y 朵鲜花

2024-06-15:用go语言,Alice 和 Bob 在一个环形草地上玩一个回合制游戏。 草地上分布着一些鲜花,其中 Alice 到 Bob 之间顺时针方向有 x 朵鲜花,逆时针方向有 y 朵鲜花。 游戏规则如下: 1.游戏从 Alice 开始。 2.每个回合中,当前玩家必须选择顺时针或逆时针,并在所选方向…

网上购物

创建数据库 安装Navicat Premium 到Navicat官网上下载,链接:https://www.navicat.com.cn/ 安装好后,通过相关命名创建数据库。 第一步:创建数据库 CREATE DATABASE 数据库名 CHARACTER SET utf8; 第二步:创建数据库表 如果之前有相同的数据库表,可以执行下面的命名删除数…

农业气象综合监测站:农业智能化革命的强力助推器

科技之光正在点亮农业领域,引领其迈向智能化的新纪元。其中,农业气象综合监测站无疑成为这场革命中的璀璨明星,它以强大的功能深度剖析气象条件与农业生产间的紧密联系,为农业生产提供精准的决策支持,从而大幅提升生产效率和安全性。农业气象综合监测站的核心职责在于实时…

数据读写流程

数据读写流程 在bitcast论文中,想要获取内存中存储的数据,我们首先得获取索引数据,在索引数据中获取到文件id以及数据存储所在位置,然后根据这些信息去读取文件内容。 所有我们在进行写数据时也得有两步,第一步将key value信息持久化到文件中,第二部是将索引信息保存到内…

第二章节C代码RUST实现

第二章节书中代码有如下内容这些C语言代码大致实现了一个简单版的 who 命令。这个命令的功能是读取系统的 utmp 文件,并显示当前登录的用户信息。utmp 文件包含关于用户登录会话的信息,包括用户名、登录终端、登录时间等。以下是对上述所有代码实现功能的总结:cp1:实现复制文…

markdown图片管理教程

markdown图片管理教程 由于markdown对图片的支持不够友好,当文件分享给他人的时候经常会出现无法查看图片的情况,而且在博文上传到线上的时候也会出现无法访问图片的情况,因此需要将网上的图片下载到本地,之后再上传到博文中。 本文将会使用vscode的插件来帮助实现所需要的…