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. Nginx开启gzip提升访问效率

    说明 最近网站考虑开启gzip压缩试试效果,gzip是nginx服务器的ngx_http_gzip_module模块提供的在线实时数据压缩功能. 通过开启gzip功能,可对服务器响应的数据进行压缩处理 ...

  2. 配置kube-apiserver基于token的认证机制

    Kubernetes除了提供了基于CA证书的认证方式,也提供了基于HTTP Token的简单认证方式.各客户端组件与API Server之间的通信方式仍然采用HTTPS,但不采用CA数字证书.这种认证 ...

  3. 学Python只需一张图

    有编程基础的人一看就可以了解 Python 的用法了.真正的 30 分钟上手.

  4. 云原生基础设施实践:NebulaGraph 的 KubeBlocks 集成故事

    像是 NebulaGraph 这类基础设施上云,通用的方法一般是将线下物理机替换成云端的虚拟资源,依托各大云服务厂商实现"服务上云".但还有一种选择,就是依托云数据基础设施,将数据 ...

  5. 2024年,提升Windows开发和使用体验实践 - 终端&命令行篇

    前言 经过前面的铺垫,终于继续更新了,这个大概率是本系列近期的最后一篇了. 同时之前有些内容更新,我也补充到这一篇里面. 关于 scoop 管理器的补充 scoop 常用命令 scoop help # ...

  6. Java Eclipse JUnit单元测试

    1 package com.bytezreo.ut; 2 3 import org.junit.Test; 4 5 /** 6 * 7 * @Description Java中的JUnit单元测试 8 ...

  7. 字典嵌套列表 与 列表嵌套字典 导出为csv 的方法

    字典嵌套列表 导出csv {'rank': ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '1 ...

  8. Zabbix MQQT协议监控 loT设备

    一. 项目背景 监控异地局域网主机(主机内有物联5G卡 可以单方面向特定的云服务器传输信息)这里采用 zabbix 5xx系列 agent2 -6.2 版本 主动模式,即客户端向服务端注册.   二. ...

  9. vite环境配置mockjs

    mockjs使用文档v2.9.6 安装插件 npm i mockjs -S npm i vite-plugin-mock@2.9.6 配置vite.config.ts文件 export default ...

  10. 使用IDEA中的Git提交代码到错误的分支,回滚代码后如何强制push代码-2022新项目

    一.问题由来 当前新项目的开发分支非常的多,自己看了一下大概有20多个分支.每次开发完一个版本就会重新创建几个新的分支,每个开发人员对应一个 自己单独的开发分支,因此才会出现这么多的分支.分支多了之后 ...