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. JavaScript的引入并执行-包含动态引入与静态引入

    JavaScript的引入并执行-包含动态引入与静态引入 JavaScript引入方式 html文件需要引入JavaScript代码,才能在页面里使用JavaScript代码. 静态引入 行内式 直接 ...

  2. 【算法day6】哈希表、有序表、链表(反转单链表)

    哈希表的简单介绍 1)哈希表在使用层面上可以理解为一种集合结构 2)如果只有key,没有伴随数据value,可以使用HashSet结构(C++中叫UnOrderedSet) 3)如果既有key,又有伴 ...

  3. 【Azure Key Vault】Key Vault能不能生成DigiCert证书?能不能自动 Rotate 证书呢?

    问题描述 因为Azure Key Vault服务上保管的证书可以轻松的与其他Azure服务集成使用,所以需要知道 Key Vault 能不能生成 DigiCert 证书?能不能自动 Rotate 证书 ...

  4. 【Azure 存储服务】关于Storage Account Queue使用的几个问题

    1) 在消费Storage Queue中的数据的时候,如何只过滤出 Subject 为"message/{messageid}"这种,去掉subject为"informa ...

  5. 如何实现十亿级离线 CSV 导入 Nebula Graph

    本文首发于 Nebula Graph Community 公众号 本次实践是基于业务需求及后续扩展,通过技术选型确定了 Nebula Graph 图数据库,首先需要验证 Nebula Graph 数据 ...

  6. 文心一言 VS 讯飞星火 VS chatgpt (206)-- 算法导论15.4 3题

    三.设计 LCS-LENGTH的带备忘的版本,运行时间为O(mn).需要写代码的时候,请用go语言. 文心一言,代码正常运行: LCS-LENGTH(Longest Common Subsequenc ...

  7. C++//queue 队列 容器 先进先出 只有队头 队尾能被外界访问 因此不允许有遍历行为

    1 //queue 队列 容器 先进先出 只有队头 队尾能被外界访问 因此不允许有遍历行为 2 3 4 #include<iostream> 5 #include<queue> ...

  8. WPF开源的一款免费、开箱即用的翻译、OCR工具

    前言 今天大姚给大家分享一款由WPF开源的.免费的(MIT License).即开即用.即用即走的翻译.OCR工具:STranslate. WPF介绍 WPF 是一个强大的桌面应用程序框架,用于构建具 ...

  9. 码上掘金 里面 嵌入自定义组件,可以用做组件demo演示

    查看代码片段 https://code.juejin.cn/pen/7128211910696108066 需求 将写的组件演示出来,默认 码上掘金 不能 嵌入组件. 解决问题 选择自定义模板,所有代 ...

  10. 自己想到的几道Java面试题

    1.在抽象类中能否写main方法,为什么? 2.在接口中能否写main方法,为什么? 3.Java能否使用静态局部变量,为什么? 4.Java类变量,实例变量,局部变量在多线程环境下是否线程安全,为什 ...