RMQ求LCA【ST】算法

【模板】LCA 文章目录LCA算法暴力dfs序+rmq LCA 简单说一下,LCA(Least Common Ancestors),最近公共祖先,字面上的意思,就是两个节点的公共祖先中,最近的那一个 算法 暴力 在线算法 首先dfs预处理出每个点的深度,然后再将u,v中比较深的那个点往上爬,将他们调整到同一深度 然后再一起一步一步地爬树,爬到同一深度 暴力算法的复杂度较高,但由于它非常的简单清晰,所以在时间不够的... 阅读详情

RMQ求LCA其实非常简单的啦

我们需要理解两个基本的工具:

1.欧拉序列;

2.线段树,二叉搜索树或者其它基本区间寻求最值的方法;

所以说LCA和区间有什么关系?

举个栗子:

我们将欧拉序列E打出:

【1,2,4,2,5,2,1,3,6,3,1】(先自己想想怎么实现)

在打印序列的同时记录下每个节点第一次出现的位置R

【1,2,8,3,5,9】

另外别忘了给欧拉序列标深度L

【1,2,3,2,3,2,1,2,3,2,1】

接下来区间最值的作用就发挥了作用了:

比如我们要找4和5LCA,我们只需要在R数组中找到【3,5】中深度最小的节点就行了;

而对应的区间可以通过R数组来确定;

接下来是moban(蒟蒻只能用领接链表建):

首先是欧拉序列的打印:

 
void dfs(int u,int dep)
{ tot++;
   R[u]=tot;//这里是第一次出现的位置;
   L[tot]=dep;
   E[tot]=u;
   vis[u]=true;
for(int i=head[u];i!=0;i=nex[i])
{int v=to[i];
    if(!vis[v]){    
    dis[v]=dis[u]+w[i];
    dfs(v,dep+1);
    E[++tot]=u;//别忘了回到u节点记录;
    L[tot]=dep;}
}
}

接下来是ST对序列进行处理(我们记录的不是最小深度,而是最小深度对应的节点)

不明白ST的可以看我的另一篇博客:https://blog.youkuaiyun.com/Wyt_code/article/details/83832104

void found()//STmoban不多说;
{ for(int i=1;i<=tot;i++)
    f[i][0]=i;
  int n=(int)(log(tot)/log(2));
   for(int j=1;j<=n;j++)
       for(int i=1;i<=tot;i++)
           if(i+(1<<j)-1<=tot){
               int a=f[i][j-1];int b=f[i+(1<<j-1)][j-1];
               if(L[a]<L[b]) f[i][j]=a;//注意是记录下标以便确定节点;
                 else f[i][j]=b;
                 }
             }

接下来是RMQ和LCA的查询(为了便于理解我分成两个板块) 

int RMQ(int l,int r)
{int j=(int)(log(r-l+1)/log(2));
int a=f[l][j];int b=f[r-(1<<j)+1][j];
return L[a]<L[b]?a:b;//还是返回数组对应下标;
}
 
int LCA(int l,int r)
{ l=R[l];r=R[r];//确定区间;
    if(l>r) swap(l,r);
    return E[RMQ(l,r)];//读求下标对应节点;
}   

emmmm好像就这些了 

 

深度解析快递柜管理系统的C++实现:设计与实现 本文详细介绍了一个基于C++的快递柜管理系统的设计与实现,包括系统需求分析、架构设计、数据库设计、关键功能模块实现和测试与验证。通过详细的代码示例和理论分析,读者可以全面了解如何开发一个完整的快递柜管理系统。希望本文能够为读者在实际项目开发中提供有价值的参考。 阅读详情

相关推荐

驱动钛丝(SMA)的应用(5)汽车腰托气阀常见问题及解决方案

财哥在前段时间发布的《驱动钛丝(SMA)的应用(1)汽车腰托支撑按摩气阀模块》一文,引发了很多企业的拜访和交流。 目前很多厂家已经启动或正在进行相关研发,同时也遇到了诸如:钛丝选型、驱动位移、响应设计、温度控制、力量设计、点动滞后、铆接工艺、量化生产等问题。

weixin_39168671的博客 1239

零零散散学算法之详解RMQ & LCA

深入理解RMQ & LCA 正文 第一节 RMQ、LCA概述 LCA:LowestCommonAncestor,译为最近公共祖先。其解释就是说:在有根树中,找出树中任意两个节点最近的公共祖先,或者说找到任意两个节点离树根最远的公共祖先。 RMQ:RangeMinimumQuery,译为区间最小值查...

weixin_33775582的博客 294

从实习生到独立上手:我是如何用海思PQTool搞定IPC图像调试的

本文分享了从实习生到独立使用海思PQTool进行IPC图像调试的成长历程。通过工具搭建、核心参数调整和实战案例,详细介绍了如何高效解决图像质量问题,特别强调了ISP调试中的关键参数和实用技巧,适合刚入门的图像调试工程师参考。

weixin_33756596的博客 311

洛谷 P3379:最近公共祖先(LCA)← RMQ+欧拉序

利用欧拉序求 LCA,本质上就是一个 RMQ 问题。而 RMQ 问题常用 ST 算法来初始化数据。

hnjzsyjyj的专栏 1343

Unity 热更新技术 |(六)xLua框架学习最新系列完整教程

开始学习热更新方面系列知识,就从这一篇开始吧! 本系列教程 会从热更新基本概念出发,详细介绍热更新相关的全套知识点。 如热更新技术基本原理、热更新主流方案、AssetBundle系列教程、Lua语言编程、Lua与Unity交互教程、Xlua框架使用、热更新实战教程等方面。 热更新作为一个开发者必备技能,如果想学习的话,可以从现在开始了哦~ 接下来先从XLua学习使用 开始学习吧!

努力前行,总会成为自己心中的那道光 1万+

Python 爬虫实战:arXiv 学术论文 PDF 批量下载(含反爬策略与文件命名规范)

arXiv 是全球最大的免费开放预印本论文平台之一,涵盖物理学、数学、计算机科学等多个学科领域。研究人员、学生和工程师常常需要批量下载论文 PDF 进行文献综述、构建机器学习数据集或进行文本挖掘研究。然而,手动逐篇下载论文效率低下,因此开发一个自动化批量下载工具显得尤为重要。

yansideyucsdn的博客 1816

普通RMQ问题转化为LCA问题的算法

基本思想是通过对问题的转化,最终得到时间复杂度。 该算法分以下两大步骤: 1)将RMQ问题转化为LCA问题:先构建输入数列A的笛卡尔树,构建笛卡尔树的复杂度为O(n)。 2)将LCA问题转化为RMQ+1/-1问题:通过对笛卡尔树的DFS遍历得到欧拉路径(Euler To

ljsspace的专栏 1944

SPICE仿真软件:Ngspice_(2).安装与配置

在Netlist文件中直接定义模型。V1 1 0 5R1 2 0 1k* Analysis库文件中可以包含多种电路元件模型和参数。

kkchenjj的博客 1585

RMQ求LCA

题目链接:https://www.luogu.org/problem/P3379 学习链接:https://blog.youkuaiyun.com/Diogenes_/article/details/81412316 预处理时间复杂度O(NlogN) 查询时间复杂度O(1) #include <bits/stdc++.h> #define rep(i, a, b) for(int ...

蒟蒻 lxw的博客 345

【Bug已解决】claude: No such file or directory — Claude Code 命令凭空消失解决方案

方案适用场景推荐指数难度方案一:重建软链接所有平台,软链接断裂⭐⭐⭐⭐⭐低方案二:修复 shebangnvm 用户,不想重装⭐⭐⭐⭐中方案三:nvm default aliasnvm 用户,长期稳定⭐⭐⭐⭐低方案四:切换到 Volta频繁切换 Node.js 版本⭐⭐⭐中方案五:修复 PATHPATH 配置丢失⭐⭐⭐⭐低方案六:Homebrew 安装macOS 用户,npm 不稳定⭐⭐⭐⭐低根本原因与。

博客 1万+

【基于 CasADi 的欠驱动无人船实时非线性模型预测控制(NMPC)实现与避碰仿真】MATLAB开源复现

本文提出了一种基于CasADi的欠驱动无人船实时非线性模型预测控制(NMPC)方法,实现了轨迹跟踪与避碰功能。研究采用三自由度USV动力学模型,集成静态与动态障碍物避碰约束,并满足国际海上避碰规则(COLREGS)。通过CasADi+IPOPT数值优化求解,实现了毫秒级实时控制。文章详细介绍了USV建模、NMPC控制器设计、避碰约束建模以及CasADi实现流程,包括核心求解流程和轨迹生成方法。实验结果表明,该方法能有效实现复杂环境下的轨迹跟踪与避碰功能。

vor234的博客 1394

求LCA的四种方法(暴力,倍增,RMQ+ST,Tarjan)

P3379 【模板】最近公共祖先(LCA) #include<bits/stdc++.h> using namespace std; struct Edge { int to,next; }edge[500005*2];//无向图,两倍开 int head[500005],grand[500005][21],depth[500005],lg[500001]; int cnt,n,m,s; inline int read() { int x=0,f=1;char ch=getch.

春弦的博客 6967

ansys非线性分析中接触类型

不分离(No Separation)‌:法向始终保持接触不分离,切向允许自由滑动,属于线性接触,适合需要法向约束、允许微小切向位移的场景,比如过盈配合的简化模拟。有摩擦(Frictional)‌:法向允许分离,切向根据用户设置的摩擦系数计算摩擦力,是工程中最符合实际机械接触的类型,绝大多数装配体分析都选择该类型。无摩擦(Frictionless)‌:法向允许接触面分离,切向无摩擦、允许自由滑动,适合模拟理想润滑的光滑接触面,图中当前选择的就是该类型。非线性接触(需要多次迭代,属于真正的非线性接触行为)‌。

qq_15963745的博客 71

倍增 || ST-RMQ 求LCA

视频讲解戳这里(bj聚聚讲的非常好,一听就懂) 由luogu一道模板题讲起传送门(都9102年,这题还卡输入输出,要吸氧才能过) LCA:求两个点的最近公共祖先 倍增求LCA: 有很多博客图文并茂讲的非常清楚,倍增LCA的主要思想就是,先将u,v(保证u的深度更深)两点调整到同一水平线 情况一:u==v,那就说明最近公共祖先是u,这种情况说明u,v在同一边,祖先自然是深度较浅的那一个...

一只不争气的蒸汽机的博客 345

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

ST(RMQ)算法(在线)求LCA

在此之前,我写过另一篇博客,是倍增(在线)求LCA。有兴趣的同学可以去看一看。概念以及各种暴力就不在这里说了,那篇博客已经有介绍了。 不会S...

weixin_30346033的博客 106

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

8.17-8.18 倍增算法及其经典应用:RMQ+ST表、树上倍增求LCA

倍增算法及其经典应用:RMQ+ST表、树上倍增求LCA

m0_62709362的博客 490

RMQ与LCA[可能是全网最水的?]

众所周知,rmq和lca有着诸多关系 今天就听我扯淡一番 欢淫来到不说人话系列( 我奶奶都会的做法 O(n2)O(n^2)O(n2) ,空间O(n)O(n)O(n) 大家普遍会的做法 (1)倍增求lca:O(nlogn)−O(logn)O(nlogn)-O(logn)O(nlogn)−O(logn),在线 (2)树链剖分求lca:O(n)−O(logn)O(n)-O(logn)O(n)−O(logn),在线,常数极小 (3)ST表求解rmqO(nlogn)−O(1)O(nlogn)-O(1)O(nlogn)

ezoileaner的博客 712

日常题解——LCA和RMQ1

这个代码没有具体的建树,只有核心的代码原理和代码实现,建树用python的邻接表最方便,遍历子节点部分参照Python遍历邻接表逻辑理解。

xiaoyu524的博客 780

RMQ和LCA

RMQ和LCA 【内容简介】   讨论解决RMQ、LCA问题的算法、以及RMQ、LCA两类问题的相互转换。它们在字符串处理和生物学计算中有着广泛应用,在信息学奥赛中更是被广泛应用和扩展,所以熟练掌握RMQ和LCA问题就显得十分重要。 ※在内容开始,我们假设一个算法预处理时间为 f(n),查询时间为g(n)。这个算法复杂度的标记为(或f(n)-g(n))。 【关键词】RMQ、LCA、ST

1238

LCA问题转化为±1RMQ问题

由于从节点u走到节点v的过程中必然经过LCA(u,v)且不会经过LCA(u,v)的父节点,所以节点u、v的LCA就是欧拉序列区间[pos[u], pos[v]]中最小节点(假设为w)所对应的D[w]。这里把分块长度改为logn/2,所以可以把每个块转化为logn/2-1长度的二进制序列,对于转化后的二进制序列不同的块称为本质不同的块,而本质相同的块查询结果是相同的。本质不同的块的数量为2^(logn/2),暴力处理所有本质不同的块的所有可能查询复杂度为(2^(logn/2))^2=2^(logn)=n。

wisoredcsdn的博客 276

对各种lca算法的理解

1.RMQ+ST   首先注意这个算法的要素:结点编号,dfs序,结点深度。   首先dfs,求出dfs序,同时求出每个结点的深度。然后st算法,维护深度最小的结点编号(dfs序也可以,因为他们俩可以互相转换,只要不是深度就行了)。这样后面查询的时候才知道lca是哪个结点。如果维护的是深度。。那就不知道了。   感觉这个算法的精髓在于:两个节点的dfs序间最小深度的结点一定是它们的...

275

O(n)-O(1) 线性 RMQ 学习笔记

On预处理,O1查询的 RMQ(区间最值)算法。而我们正常 ST 表处理 RMQ 只能做到Onlogn−O1。用四毛子算法可以做到Onloglogn−O1。四毛子算法:对原序列分块,块长为Ologn,块之间做 ST 表,每个块内做 ST 表(不能预处理前缀和后缀最值,因为可能有左右端点在一个块内的情况)。但四毛子算法还是不够优秀。那么下面我们介绍线性 RMQ 算法(也叫标准 RMQ 算法)。

deng_cheng_yu的博客 770

【NOIp复习】最近公共祖先LCA&区间最大最小RMQ

RMQ问题的在线ST算法 VIJOS 1514 #include <cstdio> #include <algorithm> #include <cmath> using namespace std; int n,m,a,b,dp[201000][30],s[201000]; void init_RMQ(){ for(in...

weixin_30649859的博客 159

POJ 1330 Nearest Common Ancestors (LCA入门题)

Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12478   Accepted: 6652 Description A rooted tree is a well-known data structure in com...

weixin_34250709的博客 100

算法数据结构之倍增

倍增及其简单应用

2403_87490946的博客 330
上一篇: 差分约束 小结(gzoi太过分啦,把我的code删啦qwq)
下一篇: switch易错提醒
Wyt_code
博客等级 码龄9年 10粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值