C++高级数据结构——ST表(倍增表)

news2024/9/30 11:24:48

 从上次写文章到现在已经27天了,将近一个月蒟蒻没有更新了。

最近学的ST表太难理解了,再加上忙,一直没时间……

---------------------------------------------------------------------------------------------------------------------------------

开始之前,请各位(尤其蒟蒻,大佬绕开这里)做好心理准备,有可能你真的会看1~2遍才能懂,因为本蒟蒻就是这样……

正文开始

今天我们所讲的叫做ST表,也被称为倍增表。

ST表一般来说是用来处理“区间最值问题”(RMQ问题),就比如一个区间内的最大值、最小值之类的。

一提到区间最值问题,第一反应肯定会想到直接for循环枚举,但这种时间复杂度实在高,如果有m次询问,那么时间就得达到大约O(mn) (蒟蒻算时间复杂度很垃圾,也许不对:( ),但使用ST表,时间就会骤降到O(nlogn),其中,每次询问只是O(1)的时间,太猛了简直。

思想:

ST表采用动态规划的思想,但是他表达状态的方式不太一样。(不要问发明的人怎么想到的,记就完了)

我们先假设求区间最大值

定义f[i][j]表示从i开始,向后2^j个数这个区间内的最大值。那么我们看下图:

注:个数为(尾-头+1),所以i+2^j-1-i+1=2^j 

上图为整体,我们把这个整体分成两部分

 我们既然分为两个部分了,那么我们最后的那个结果,不管绿的部分的右端点在哪儿,或者红部分的左端点在哪儿,我们的结果都不发生改变。所以要极端一点:假设以下部分:

i+2^j-1=r(其中r为我们所求全部区间的右端点)

r-2^j+1=l(l为我们所求全部区间的左端点)

最后求出来,j=log2(r-l+1) 请没学过log的同学自行补习,比如本蒟蒻:(((

那么整个区间的最大值,就是两部分最大值再次进行比较。

得出状态转移方程:

f[i][j]=max(f[i][j-1],f[i+2^(j-1)][j-1])

思路差不多就讲完了,下面来看看模板代码:

在难懂的地方我会有注释,实在不懂私信蒟蒻()

scanf("%lld%lld",&n,&m);
for (int i=1;i<=n;i++){
	scanf("%lld",&f[i][0]);
}
for (int j=1;(1<<j)<=n;j++){//枚举那个指数,运用位运算
	for (int i=1;i<=n-(1<<j)+1;i++){//枚举所有剩下的i的情况
		f[i][j]=max(f[i][j-1],f[i+(1<<j-1)][j-1]);//转移方程,里面还是使用位运算,因为一个字,快
	}
}
for (int i=1;i<=m;i++){
	int l,r;
	scanf("%lld%lld",&l,&r);
	int s=log2(r-l+1);//反求一下指数
	printf("%lld\n",max(f[l][s],f[r-(1<<s)+1][s]));//两个区间取最大值
}

例题:

纯纯大模板

给定一个长度为 N 的数列,和 M 次询问,求出每一次询问的区间内数字的最大值。

输入

第一行包含两个整数 N,M,分别表示数列的长度和询问的个数。

第二行包含 N 个整数(记为 ai),依次表示数列的第 i 项。

接下来 M 行,每行包含两个整数 li,ri,表示查询的区间为 [li,ri]。

输出

输出包含 M 行,每行一个整数,依次表示每一次询问的结果。

样例输入1
8 8
9 3 1 7 5 6 0 8
1 6
1 5
2 7
2 6
1 8
4 8
3 7
1 8
样例输出1
9
9
7
7
9
8
7
9

希望各位同学在自己理解的基础上,尽量独立完成

分析优缺点:
 

优点:时间太猛辣!空间太猛辣!

缺点:不能修改任何的值,除非使用线段树

今天对于ST表的讲解就到这里,大家下期再见!

 

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

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

相关文章

Tarball管理

文章目录 Tarball管理Tarball安装的基本步骤一般 Tarball 软件安装的建议事项 Tarball管理 从源代码的说明我们知道制作一个二进制程序需要很多东西&#xff0c;这包括下面这些基础的软件。 gcc或cc等C语言编译器make及autoconfig等软件需要内核提供的Library以及相关的inclu…

win11使用命令行建立wifi热点,并可以设定名称密码等

主要是想自动化的实现打开wifi热点,ssid和wifi密码可控!手机设定比较简单,但是用程序行来设定还真是比较麻烦。 查了一下,有人使用netsh 无法解决,也就是说无法使用如下命令启动移动热点: netsh wlan set hostednetwork mode=allow ssid=wifi888 key=88888888 netsh wl…

信息安全实践1.2(重放攻击)

前言 这个实验是看一本书做的&#xff0c;就是李华峰老师的书——《Metasploit Web 渗透测试实战》&#xff0c;我之前写过一篇Slowloris DoS攻击的博客&#xff0c;也是看这本书写的&#xff0c;总的来说&#xff0c;有用处。这篇博客其实也只是很浅显的去做一下重放攻击。 要…

PyTorch 深度学习 || 专题二:PyTorch 编程基础

PyTorch 编程基础 文章目录 PyTorch 编程基础1. backword 求梯度2. 常用损失函数2.1 均方误差损失函数2.2 L1范数误差损失函数2.3 交叉熵损失函数 3. 优化器 1. backword 求梯度 import torchw torch.tensor([1.], requires_gradTrue) x torch.tensor([2.], requires_gradTr…

R实践——【rgplates】安装、介绍、入门

【rgplates】安装、介绍、入门 1. rgplates 安装1.1 easy way1.2 备案方法 2. rgplates 介绍3. rgplates 在线方法入门3.1 加载rgplates3.2 板块重建3.3 独立的地点坐标3.3.1 单个现存坐标点3.3.2 单个点的古坐标3.3.3 多个点的古坐标 3.4 现今的海岸线3.5 其他的重建模型3.6 在…

JMeter 性能测试基本过程及示例

jmeter 为性能测试提供了一下特色&#xff1a; 2023年最新出炉性能测试教程&#xff0c;真实企业性能压测全流程项目实战训练大合集&#xff01;_哔哩哔哩_bilibili2023年最新出炉性能测试教程&#xff0c;真实企业性能压测全流程项目实战训练大合集&#xff01;共计11条视频&…

javascript获取对象的键名列表、键值列表

Object.keys&#xff1a;获取对象的键名列表 Object.values&#xff1a;获取对象的键值列表 <script>var obj {name: 1,age: 2,order: 3}const klist Object.keys(obj)const vals Object.values(obj)console.log(obj, obj)console.log(键名列表, klist)console.log(键…

STM32F4_位带操作

目录 1. 位带简介 2. 别名区地址的计算 2.1 合并计算 3. 位带操作访问ODR和IDR寄存器 4. GPIOB->MODER&~(3<<(9*2));GPIOB->MODER|0<<9*2 / GPIOB->MODER&~(3<<(9*2));GPIOB->MODER|1<<9*2 位带操作在写单片机程序时&#xf…

springboot+vue 刘老师

课程内容 前端&#xff1a;vue elementui 后端&#xff1a;springboot mybatisplus 公共云部署 ------boot-------- 热部署 不用devtools&#xff0c;交给jrebel工具 RequestMapping ​ 参数 value 路径 method 方法consumes 请求媒体类型 如 application/jsonproduces …

DJ5-7 缓冲区管理

目录 5.7.1 缓冲的引入 5.7.2 单缓冲和双缓冲 1、单缓冲&#xff08;Single Buffer&#xff09; 2、双缓冲&#xff08;Double Buffer&#xff09; 3、双机通信时缓冲区的设置 5.7.3 循环缓冲 1、循环缓冲的组成 2、循环缓冲区的使用 3、进程同步 5.7.4 缓冲池 …

Spring Security源码剖析从入门到精通.跟学尚硅谷

1.1 概要 Spring 是非常流行和成功的 Java 应用开发框架&#xff0c;Spring Security 正是 Spring 家族中的成员。Spring Security 基于 Spring 框架&#xff0c;提供了一套 Web 应用安全性的完整解决方案。 正如你可能知道的关于安全方面的两个主要区域是“认证”和“授权”…

Mediapipe人体识别库

一、简介 官网&#xff1a;MediaPipe | Google for Developershttps://developers.google.cn/mediapipe Mediapipe 是2012年起开始公司内部使用&#xff0c;2019年google的一个开源项目&#xff0c;可以提供开源的、跨平台的常用机器学习(machine learning)方案。Mediapipe…

python-sqlite3使用指南

python下sqlite3使用指南 文章目录 python下sqlite3使用指南开发环境sqlite3常用APICRUD实例参考 开发环境 vscode ​ 开发语言&#xff1a; python vscode SQLite插件使用方法&#xff1a; 之后在这里就可以发现可视化数据&#xff1a; sqlite3常用API Python 2.5.x 以上…

信息安全实践1.3(HTTPS)

前言 做这个实验对Tomcat的版本有要求&#xff0c;最好是使用Tomcat8。因为我之前使用Tomcat10&#xff0c;然后一直做不出来。 要求 部署Web服务器端HTTPS功能&#xff0c;通过网络嗅探分析HTTPS通过SSL实施安全保护的效果 关键步骤 首先要给tomcat配置https&#xff0c;也…

设计模式之美-实战一(上):业务开发常用的基于贫血模型的MVC架构违背OOP吗?

领域驱动设计&#xff08;Domain Driven Design&#xff0c;简称DDD&#xff09;盛行之后&#xff0c;这种基于贫血模型的传统的开发模式就更加被人诟病。而基于充血模型的DDD开发模式越来越被人提倡。所以&#xff0c;我打算用两节课的时间&#xff0c;结合一个虚拟钱包系统的…

超低功耗三通道低频无线唤醒ASK接收 125k soc芯片UM2082F08

UM2082F08 是基于单周期 8051 内核的超低功耗 8 位、、具有三通道低频无线唤醒 ASK 接收功能的 SOC 芯片。芯片可检测 30KHz~300KHz 范围的 LF&#xff08;低频&#xff09;载波频率数据并触发唤醒信号&#xff0c;同时可以调节接收灵敏度&#xff0c;确保在各种应用环境下实现…

代码随想录算法训练营15期 Day 6 | 242.有效的字母异位词 、349. 两个数组的交集 、202. 快乐数、1. 两数之和

由于昨天是周日&#xff0c;周日是休息日&#xff0c;所以就是什么也没有写啦。今天是day06天&#xff0c;继续加油。 哈希表理论基础 建议&#xff1a;大家要了解哈希表的内部实现原理&#xff0c;哈希函数&#xff0c;哈希碰撞&#xff0c;以及常见哈希表的区别&#xff0c;…

Toolkit.getDefaultToolkit()获得的java.awt.Toolkit是不是同一个? 是否为单例设计模式?答案是**是**

Toolkit.getDefaultToolkit()获得的java.awt.Toolkit是不是同一个? 是否为单例设计模式? 答案是是 反复调用Toolkit.getDefaultToolkit()获得的 java.awt.Toolkit 是同一个 import java.awt.Toolkit;public class GetDefaultToolkit是不是获得单例Toolkit {static public …

【P43】JMeter 吞吐量控制器(Throughput Controller)

文章目录 一、吞吐量控制器&#xff08;Throughput Controller&#xff09;参数说明二、测试计划设计2.1、Total Executions2.2、Percent Executions2.3、Per User 一、吞吐量控制器&#xff08;Throughput Controller&#xff09;参数说明 允许用户控制后代元素的执行的次数。…

中级软件设计师考试总结

目录 前言考前学习宏观什么是软考涉及的知识范围软考整体导图总结 微观我的分享——希尔排序学习过程结构化做题 考试阶段确定不确定 考后总结 前言 作为一名中级软件设计师&#xff0c;考试是衡量自己技能和水平的一项重要指标。在备考和考试过程中&#xff0c;我通过总结经验…