ST表

Part 1:ST表解决的问题是什么

ST 表可以用来解决RMQ(区间最值问题)等可重复贡献的问题。

ST表基于倍增的思想来实现。

Part 2:ST表的实现

ST表通过 O(nlog⁡n)<script type="math/tex;mode=inline" id="MathJax-Element-4">O(n \log n)</script>O(n \log n) 的预处理,得到 O(1)<script type="math/tex;mode=inline" id="MathJax-Element-2">O(1)</script>O(1) 的询问。

定义:

  • f[i][k] 表示 i 到 i+2k−1<script type="math/tex;mode=inline" id="MathJax-Element-3">i+2^k-1</script>i+2^k-1 中要维护的值(max,min,gcd等)。

初始化:

  • f[i][0] = a[i]

计算过程(以求 max 为例):

for(int k=1;(1<<k)<=n;k++){
for(int i=1;i+(1<<k)-1<=n;i++){
f[i][k] = max(f[i][k-1],f[i+(1<<(k-1))][k-1]);
}
}

这里使用了位运算来加速。

计算好了还需要支持查询,对此可以单独写一个函数:

int query(int l,int r){
int k = log2(r-l+1);
return max(f[l][k],f[r-(1<<k)+1][r]);
}

我们想要的是 l+2k−1≤r<script type="math/tex;mode=inline" id="MathJax-Element-5">l+2^k-1\le r</script>l+2^k-1\le r ,所以 k 就是 log2⁡(r−l+1)<script type="math/tex;mode=inline" id="MathJax-Element-1">\log_2(r-l+1)</script>\log_2(r-l+1) 。
下面的式子实际上表示了下图的样子:

<img src="https://pic3.zhimg.com/v2-595bdb6722409f9dc932362bb99ea4f6_b.jpg" data-caption="" data-size="normal" data-rawwidth="347" data-rawheight="106" class="content_image" width="347"/>

其中重叠的部分就解释了“可重复贡献”这个名词。

因为最大值始终是最大值,我只需要覆盖整个区间即可,而不需要精准覆盖。

Part 3:例题和代码

例题

注意这题有点卡时间,最好优化一下计算 log2 的部分和输入输出。

const int N=100005;
int n,m,a[N],f[N][20],lg2[N];
void init(){
for(int k=1;(1<<k)<=n;k++){
for(int i=1;i+(1<<k)-1<=n;i++){
f[i][k] = max(f[i][k-1],f[i+(1<<(k-1))][k-1]);
}
}
}
int query(int l,int r){
int k = lg2[r-l+1];
return max(f[l][k],f[r-(1<<k)+1][k]);
}
int main(){
n=read();m=read();
F(i,2,n) lg2[i] = lg2[i/2] + 1;
F(i,1,n) f[i][0] = read();
init();
while(m--){
int l=read(),r=read();
writeln(query(l,r));
}
return 0;
}

算法学习笔记【5】| ST表的更多相关文章

  1. 「学习笔记」ST表

    问题引入 先让我们看一个简单的问题,有N个元素,Q次操作,每次操作需要求出一段区间内的最大/小值. 这就是著名的RMQ问题. RMQ问题的解法有很多,如线段树.单调队列(某些情况下).ST表等.这里主 ...

  2. 算法学习笔记(3): 倍增与ST算法

    倍增 目录 倍增 查找 洛谷P2249 重点 变式练习 快速幂 ST表 扩展 - 运算 扩展 - 区间 变式答案 倍增,字面意思即"成倍增长" 他与二分十分类似,都是基于" ...

  3. 算法学习笔记(5): 最近公共祖先(LCA)

    最近公共祖先(LCA) 目录 最近公共祖先(LCA) 定义 求法 方法一:树上倍增 朴素算法 复杂度分析 方法二:dfs序与ST表 初始化与查询 复杂度分析 方法三:树链剖分 DFS序 性质 重链 重 ...

  4. 某科学的PID算法学习笔记

    最近,在某社团的要求下,自学了PID算法.学完后,深切地感受到PID算法之强大.PID算法应用广泛,比如加热器.平衡车.无人机等等,是自动控制理论中比较容易理解但十分重要的算法. 下面是博主学习过程中 ...

  5. Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法

    Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法 昨天在开发的时候遇到个小问题,就是如何将Grid的内容与Form一起发送到服务器端.默认情况下,表单(F ...

  6. C / C++算法学习笔记(8)-SHELL排序

    原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...

  7. Manacher算法学习笔记 | LeetCode#5

    Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...

  8. Johnson算法学习笔记

    \(Johnson\)算法学习笔记. 在最短路的学习中,我们曾学习了三种最短路的算法,\(Bellman-Ford\)算法及其队列优化\(SPFA\)算法,\(Dijkstra\)算法.这些算法可以快 ...

  9. Johnson 全源最短路径算法学习笔记

    Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些 ...

  10. Miller-Rabin 与 Pollard-Rho 算法学习笔记

    前言 Miller-Rabin 算法用于判断一个数 \(p\) 是否是质数,若选定 \(w\) 个数进行判断,那么正确率约是 \(1-\frac{1}{4^w}\) ,时间复杂度为 \(O(\log ...

随机推荐

  1. 大米新闻微信小程序和Springboot新闻管理系统项目源码

    介绍 本项目分为大米news小程序端和springboot新闻管理系统后台项目.小程序主要用来新闻展示,后台管理系统用于提供相关新闻API. 项目源码 参考:https://www.bilibili. ...

  2. Java并发编程实例--16.使用ReentrantLock实现线程同步

    Java提供另一机制去同步代码块.它比synchronized关键字更强大且易用. 它是基于Lock接口和其实现类例如:ReentrantLock. 这一机制对比synchronized关键字的优势在 ...

  3. 《系列二》-- 10、initialize-初始化bean

    目录 initializeBean 方法源码如下 二.重要操作 2.1 应用 Aware 2.2 applyBeanPostProcessorsBeforeInitialization: 2.3 in ...

  4. golang常用库包:redis操作库go-redis使用(03)-高级数据结构和其它特性

    Redis 高级数据结构操作和其它特性 第一篇:go-redis使用,介绍Redis基本数据结构和其他特性,以及 go-redis 连接到Redis https://www.cnblogs.com/j ...

  5. Golang Web 框架 Gin 基础学习教程集合目录

    Gin Web 框架基础学习系列目录 01-quickstart 02-parameter 03-route 04-middleware 05-log 06-logrus 07-bind 08-val ...

  6. RN运行ios报错No matching function for call to 'RCTBridgeModuleNameForClass'

    xcode更新12.5后,ios运行报错No matching function for call to 'RCTBridgeModuleNameForClass' 解决方法: 在ios/Podfil ...

  7. 最新最简单安装龙蜥操作系统centos8

    下载 https://openanolis.cn/download 我用的是稳定版本 Anolis OS8.2QU1 安装(vm用的15.5pro) 关键点 进去后,输入命令 ip a // 查看ip ...

  8. vscode配置远程开发环境

    下载vscode 下载好了后,先安装两个插件,商店里面搜索"Chinese",中文语言包, "python"安装包,安装好后重启vscode. 本地的pytho ...

  9. 在矩池云使用Llama2-7B的方法

    今天给大家分享如何在矩池云服务器使用 Llama2-7b模型. 硬件要求 矩池云已经配置好了 Llama 2 Web UI 环境,显存需要大于 8G,可以选择 A4000.P100.3090 以及更高 ...

  10. Error creating bean with name 'XXX': Bean with name 'senseOneToSomeFeignImpl' has been injected into other beans [XXXXXX] in its raw version as part of a circular reference

    关于Spring框架中的循环依赖问题,您可以尝试以下几种方法来解决: 重新定义Bean依赖:重构代码以消除循环依赖.这可能涉及重新设计类,使它们不相互依赖即可运行. 使用Setter注入:与构造函数注 ...