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. docker启动nginx https自签名证书配置

    启动测试应用时, 有时需要自己配置证书签名: 1 使用系统自带openssl openssl req \ > -x509 \ > -nodes \ > -days 365 \ > ...

  2. CentOS 8安装RabbitMQ

    第一步:安装yum仓库 导入签名KEY: ## primary RabbitMQ signing key ## 这一步如果因为网络问题下载不成功,可以先将签名文件下载下来,本地导入 rpm --imp ...

  3. 基于kubeadm部署k8s1.80.0

    k8s搭建 硬件要求 测试环境 # master 2核 4G 20G # node 4核 8G 40G 生产环境 # master 8核 16G 100G # node 16核 64G 500G 方式 ...

  4. Java面向对象之接口和抽象类的区别一目了然

    介绍 相信对于Java面向对象部分,很多人很长一段时间对于接口和抽象类的区别,使用场景都不是很熟悉,同是作为抽象层重要的对象,工作中到底什么情况下使用抽象类,不是很清楚.本文就一次性把这些概念一次性说 ...

  5. 扣子(coze.cn)| 由浅入深,手把手带你实现Java转型学习助手

    扣子(coze.cn)是一款用来开发新一代 AI Chat Bot 的应用编辑平台,无论你是否有编程基础,都可以通过这个平台来快速创建各种类型的 Chat Bot,并将其发布到各类社交平台和通讯软件上 ...

  6. [Azure Developer]把Azure Function中ILogger对象静态化为静态方法提供日志记录

    问题描述 在Azure Function代码中,有默认的ILogger对象来记录函数的日志,如果函数引用了一些静态对象,是否有办法使用这个默认的ILogger对象来记录日志呢? using Syste ...

  7. 【Azure 环境】Azure门户中 Metrics 图表的聚合指标每项具体代表什么意思呢?

    问题描述 下图中,指标里的每项聚合指标具体代表什么呢? 问题解答 Azure Metrics 指标中提供了五种基本的聚合类型. Sum - 在聚合间隔内捕获的所有值的总和. 有时称为总聚合. Coun ...

  8. 【转载】Java并发之AQS详解

    一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQ ...

  9. Zabbix6.0使用教程 (二)—zabbix6.0常用术语

    上一次我们已经详细介绍了zabbix6.0的新增功能,本篇我们来说说zabbix6.0常用的一些术语,这个对小伙伴日常使用zabbix的时候还是非常有用,建议大家收藏起来,话不多说,附上干货. 概览 ...

  10. C++ Qt开发:QNetworkAccessManager网络接口组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QNe ...