浅谈RMQ(ST)

本文介绍了一种名为STSTST的高效算法,该算法适用于处理大量区间查询问题,特别是寻找区间内的最大值或最小值。通过预处理和动态规划,STSTST算法能够在常数时间内回答查询,大大提高了处理效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STSTST这种算法是少有的简单(理解)而又简单(实现)的算法。

题目导入:

题目描述
2008年9月25日21点10分,酒泉卫星发射中心指控大厅里,随着指挥员一声令下,长征二号F型火箭在夜空下点火起飞,神舟七号飞船载着翟志刚、刘伯明、景海鹏3位航天员,在戈壁茫茫的深邃夜空中飞向太空,开始人类漫步太空之旅。第583秒,火箭以7.5公里/秒的速度,将飞船送到近地点200公里、远地点350公里的椭圆轨道入口。而此时,火箭的燃料也消耗殆尽,即将以悲壮的方式与飞船告别。这个过程,在短短不到10分钟时间内,翟志刚和他的两名战友体会到了从超重到失重的过程。
除了超重和失重的感觉之外,就是浩瀚的长空中璀璨的星星,和地面上看到的星星不同,在太空中看到的星星是成一条直线的,一共有N(1<=N<=100,000)颗星星,编号为1到N,每个星星有自己的体积,由于在飞船中很无聊,除了不停地玩弄手中失重的书和笔之外没有别的事可干,此时翟志刚说我们来玩游戏吧,一共玩了M轮(1<=M<=100,000),每一轮都是给出两个整数L和R(1<=L<=R<=N),询问第L到第R颗星星之间最大星星的体积,每次答对的人就可以多休息一段时间。
由于翟志刚还要进行太空漫步,所以他现在请你帮忙,你得到的回报就是太空饼干。
输入
第一行输入N,M
接下来一行N个整数,表示星星的体积(1<=体积<=maxlongint)
接下来M行,每行两个整数L_i,R_i,表示询问区间。
输出
输出M行,每一行表示询问区间L_i到R_i之间最大星星的体积。
样例输入
6 3
5 7 3 9 2 10
1 3
2 4
3 6
样例输出
7
9
10

进入正题。STSTST算法就是用于解决以上问题的算法,我们称之为:给你一个超长的区间,不动它(像树状数组,线段树就是动的),问你超多的“这个区间最大(小)值是什么?”的问题。

首先我们定义一个f数组。

f[i,j]f[i,j]f[i,j]

代表由i为起点长度为2^j的区间最大值(这里先用最大值,最小值同理嘛)
那么怎么求f数组呢。
DPDPDP
f[i,j]=max(f[i,j−1]f[i,j]=max(f[i,j-1]f[i,j]=max(f[i,j1]前面一半,f[i+2j−1,j−1]f[i+2^j-1,j-1]f[i+2j1,j1]后面一半)
就是前面的最大值和后面的最大值取最大值,即当前最大值。
是不是很简单?

那么问问题的时候怎么回答呢?
比如问区间li,rili,rili,ri
我们求出一个最大的X满足2x&lt;=ri−li+12^x&lt;=ri-li+12x<=rili+1(就是区间长度),即
在这里插入图片描述
区间最大值就是max(f[li,x],f[ri−2x+1,x])max(f[li,x],f[ri-2^x+1,x])max(f[li,x],f[ri2x+1,x]);
为什么是这样呢?
当log操作正好为整数时,区间如下:
在这里插入图片描述
这样等于说以li为起点向后推2x2^x2x个(maxmaxmax中两个都是一个区间),已经求出来了。

那么,当logloglog操作不是整数时,区间如下。
在这里插入图片描述
显然,2x2^x2x保证了两个子区间既在大区间中,又保证了两区间有重叠(不断开)。
所以,已经很明显了。

tips:tips:tips

log2log2log2操作不用每次调用,可以预处理,用一种动归思路。
log[i]log[i]log[i]表示LOGiLOGiLOGi向下取整的值。
log[i]=log[i/2]+1log[i]=log[i/2]+1log[i]=log[i/2]+1(小一级的logloglog值加一就是大logloglog,即多乘一次2)

讲的比较浅,有问题私聊。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值