RMQ与LCA学习笔记

news/2025/10/10 21:03:53/文章来源:https://www.cnblogs.com/Lmy33721345132/p/19133865

在开始之前先提一下RMQ与LCA这两个东西有什么关系
对于一个序列,对它构建出一颗笛卡尔树之后,两个点的LCA就是原序列中这两个点之间的最大值/最小值(取决于建树时的比较方式)
而对于一棵树,求出来他的欧拉序之后,两个点的LCA,就是两个点在欧拉序第一次出现的位置之间的深度最小值的点
所以LCA问题和RMQ问题是可以相互转换的

RMQ

RMQ 即区间最值问题,根据情景的不同,我们可以给出不同的方法

静态区间最值问题

ST表

ST表,是一个处理静态可重复贡献问题的利器,区间最值显然是可以重复贡献的。
\(st_{i,k}\) 表示原序列中 \([i,i+2^k-1]\) 中的最值,显然初始化是 \(st_{i,0}=a[i]\)
我们可以将 \([i,i+2^k-1]\) 拆分成 \([i,i+2^{k-1}-1]\)\([i+2^{k-1},i+2^{k}-1]\) ,这两个区间中的最值显然是 \(st_{i,k-1}\)\(st_{i+2^{k-1},k-1}\)
所以我们从小到大枚举 \(k\) ,用 \(st_{i,k-1}\)\(st_{i+2^{k-1},k-1}\) 更新 \(st_{i,k}\)

for(int i=1;i<=n;i++)f[i][0]=read();
int t=log2(n);
for(int i=1;i<=t;i++){for(int k=1;k<=n-(1<<i)+1;k++){f[k][i]=max(f[k][i-1],f[k+(1<<(i-1))][i-1]);}
}//这里的i,k与上文中是反过来的

查询时,需要将 \([l,r]\) 拆成两个区间,使它们覆盖整个 \([l,r]\) ,可以发现 \(st_{l,\lfloor log_{2}{r-l+1}\rfloor}\) \(st_{r-2^{\lfloor log_{2}{r-l+1}\rfloor}+1,\lfloor log_{2}{r-l+1}\rfloor}\) 可以覆盖整个区间。

for(int i=1;i<=m;i++){int l,r;l=read();r=read();int k=log2(r-l+1);write(max(f[l][k],f[r-(1<<k)+1][k]));puts("");
}

预处理时间复杂度为 \(O(nlogn)\) ,单次查询复杂度为 \(O(1)\)

Method of Four Russians

就是人们常说的“四毛子”,这个算法在ST表的基础上进行了优化。
对序列进行分块,设块长为 \(B\) ,在块间建立ST表,时间复杂度为 \(O(\frac{N}{B}log{\frac{N}{B}})\),在块内建立ST表,时间复杂度为 \(O(\frac{N}{B}Blog{B})\).
查询时,若 \(l,r\) 在同一个块内,直接用块内的ST表查询,若 \(l,r\) 不在同一个块内,那么对于散块用块内的ST表查询,对于整块用块间的ST表查询。查询时间复杂度为 \(O(1)\)
\(B\)\(O(log_2{n})\) 时,预处理时间复杂度是 \(O(nloglogn)\)

struct FR{int ST[N/len+5][log2(N/len)+5],st[N][log2(len)+5];struct block{int l,r,ma;}b[N/len+5];void init(){for(int i=1;i<=id(n);i++){b[i].l=b[i-1].r+1;b[i].r=i*len;b[i].ma=0;}b[id(n)].r=n;for(int i=1;i<=id(n);i++){int t=log2(b[i].r-b[i].l+1);for(int k=b[i].l;k<=b[i].r;k++)st[k][0]=a[k],b[i].ma=max(b[i].ma,a[k]);for(int k=1;k<=t;k++){for(int j=b[i].l;j+(1<<k)-1<=b[i].r;j++){st[j][k]=max(st[j][k-1],st[j+(1<<(k-1))][k-1]);}				}}for(int i=1;i<=id(n);i++)ST[i][0]=b[i].ma;int t=log2(id(n));for(int i=1;i<=t;i++){for(int k=1;k+(1<<i)-1<=id(n);k++){ST[k][i]=max(ST[k][i-1],ST[k+(1<<(i-1))][i-1]);}}}int ask(int l,int r){int p=id(l),q=id(r);if(p==q){int t=log2(r-l+1);return max(st[l][t],st[r-(1<<t)+1][t]);}int x,y,z;int t=log2(b[p].r-l+1);x=max(st[l][t],st[b[p].r-(1<<t)+1][t]);t=log2(r-b[q].l+1);y=max(st[b[q].l][t],st[r-(1<<t)+1][t]);if(p+1>q-1)return max(x,y);t=log2(q-1-(p+1)+1);z=max(ST[p+1][t],ST[(q-1)-(1<<t)+1][t]);return max(x,max(y,z));}
}f;

但由于每次查询会使用3次ST表,所以常数会比直接建ST表大很多,在 \(n\) 较小的时候还是直接写ST表好

优化

\(l,r\) 不在一个块内时,考虑对于散块的查询,我们只需要考虑一个前缀或后缀的贡献就可以了,这样就可以将ST表调用次数降低到1次

O(N)-O(1)Rmq

四毛子的瓶颈在于当 \(l,r\) 在同一块时,没法做到快速处理。
这里给出一个基于状压的线性RMQ的做法
……

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

the charm of Chinese language

The charm of Chinese language is you use it to read books. when I can read the original books translation as Chinese. I found the original one lets people dizzy, maybe it needs some graphs to make the …

mamba-硬件感知算法

扫描操作由于A B C这些矩阵现在是动态的了,因此无法使用卷积表示来计算它们(卷积核是固定的),因此,我们只能使用循环表示,如此也就而失去了卷积提供的并行训练能力 Mamba通过并行扫描(parallel scan)算法使得最终并…

完整教程:lua代码解析1

完整教程:lua代码解析1pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…

system表空间丢失部分文件恢复---惜分飞

system表空间丢失部分文件恢复---惜分飞联系:手机/微信(+86 17813235971) QQ(107644445) 标题:system表空间丢失部分文件恢复 作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任…

二维数点

介绍 给出一个二维平面內的若干个点,多次询问某个矩形区域內包含多少个点(边界也算)。又或者,给一个长为 n nn 的序列,多次询问区间 [ l , r ] [l,r][l,r] 中值在 [ x , y ] [x,y][x,y] 内的元素个数。 例题 P190…

gitee和github如何修改仓库名并且保持与原远程仓库的连接?(手把手教学) - 实践

gitee和github如何修改仓库名并且保持与原远程仓库的连接?(手把手教学) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…

2025.10.10总结 - A

今天上了节英语,感觉还可以,下雨了,一直在宿舍,感觉很爽。

[20251010]建立完善tpt的prr.sql脚本.txt

[20251010]建立完善tpt的prr.sql脚本.txt--//昨天在测试时不小心输入pr命令时多输入一个r,没想到居然执行了,说明在本目录或者SQLPATH环境目录下存在prr.sql脚本。--//当时忙着处理其他事情,先把这件事情放一放,今…

第十一篇

今天是10月10号,今天只上了一节英语课,学习了新的单词,颇有收获。

[Flutter] Flutter APK构建签名并推广到Github workflow

[Flutter] Flutter APK构建签名并推广到Github workflowFlutter APK构建签名并推广到Github workflow 最近在开发flutter软件的时候发现构建出来的apk在手机上不能直接覆盖更新,会提示签名不一致,但由于我的软件是在…

Windows 电脑安装 XTerminal 1.25.1 x64 版(带安装包下载关键词)​

Windows 电脑安装 XTerminal 1.25.1 x64 版(带安装包下载关键词)​​XTerminal​ 是一款运行在 Windows 系统上的终端工具(类似命令行窗口),通常用于开发者、运维人员或高级用户来执行命令、连接远程服务器、运行…

YOLOv11的神经辐射场(NeRF)辅助训练-(通过合成视角增强内容多样性)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

题解:AT_arc138_f [ARC138F] KD Tree

题意:平面上有 \(n\) 个点 \((i,p_i)\),\(p\) 是一个排列。每次操作可以选择 \(x/y\) 和一个坐标,将点列分成左右/上下两边(保持两边的相对顺序不变),分别递归下去,直到只剩下一个点,把它加入答案序列末尾。求…

SP33 TRIP - Trip 个人题解

题目链接 题目大意: 给出两个字符串,要求求出所有 LCS (最长公共子序列问题)的具体方案,并按字典序输出 解题方法: 首先我们要清楚求 LCS 的长度的方法,按照闫氏DP分析法我们得到一下过程:但是我们如果直接在此…

经营不是老板一个人的事 - 智慧园区

很多企业都陷入了“高层定目标,中层传口号,基层盲执行”的怪圈。一提到“经营”,大家就会想到董事长、总经理,觉得那是高层的事。但真相是:如果经营思维只停留在高层,企业正在走向危险边缘。一、经营到底是什么?…

Codeforces Round 1051 (Div. 2)[A ~E]

―僕は其れに縋る事さえ/出来無かった訳ですから目录Codeforces Round 1051 (Div. 2)A. All Lengths SubtractionB. DiscountsC. Max TreeD. Inversion Graph Coloring Easy Version/Hard VersionE. Make Good Codefo…

如何在 Spring Boot 应用中配置多个 Spring AI 的 LLM 客户端

1. 概述 越来越多的现代应用开始集成大型语言模型(LLM),以构建更智能的功能。如何使用Spring AI快速整合LLM能力到自己的Spring Boot应用,在之前的博文中有过很多篇关于使用Spring AI使用不同供应商LLM的整合案例。…

【Azure APIM】解答REST API实现禁用自签名证书的证书链验证中的backends参数值从那里取值的问题?

问题描述 使用APIM服务时候,因为后端的API需要使用自签名证书进行验证。如果通过浏览器直接访问后端API返回正常,但是APIM请求的时候返回为500报错。 在开启Trace后,发现报错信息为:error message :The underlyin…

2025 AI 进化图谱:技术突破、场景落地与产业重构 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …