ST表 (求区间最大/最小值)

ST表是一种用于解决RMQ问题(区间最值问题)的数据结构,通过O(nlogn)预处理,能实现O(1)查询区间最大值。其核心思想是倍增,将区间拆分为两部分并取最大值。查询时,根据区间长度计算所需层数,从左右两端点分别进行,确保覆盖查询区间。

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

ST表

ST表的功能很简单

它是解决RMQ问题(区间最值问题)的一种强有力的工具

它可以做到O(nlogn)预处理,O(1)是查询最值

像线段树是O(logn)的查询

 

算法

ST表是利用的是倍增的思想

拿最大值来说

我们用st[i][j]表示,从i位置开始的2^j个数中的最大值,例如st[i][1]表示的是i位置和i+1位置中两个数的最大值

那么转移的时候我们可以把当前区间拆成两个区间并分别取最大值(注意这里的编号是从1开始的)

查询的时候也比较简单

我们计算出log2(​区间长度)

然后对于左端点和右端点分别进行查询,这样可以保证一定可以覆盖查询的区间

刚开始学的时候我不太理解为什么从右端点开始查的时候左端点是r-2^k+1r−2k+1

实际很简单,因为我们需要找到一个点x,使得x+2^k-1=r

这样的话就可以得到x=r−2^k+1

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int st[N][21]; 
int query(int l,int r)
{
	int k=log
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值