C++ 区间最值查询问题 RMQ ST表

什么是RMQ (RMQ:Range Minimum/Maximum Query)

RMQ是指在区间内寻找最大或最小值的问题

给出一个包含 n 个数字的数组 a 和 m 个询问 [ l,r ]

要求输出 a [ l ] 到 a [ r ] 中最大 / 最小的数

举个栗子,数组:1,2,3,4,5

询问:l = 2,r = 4

显然,2,3,4 中最大的数字是 4

乍一看这个问题非常简单,每次询问时使用for循环跑一遍,再输出最值就可以了

但在 1 ≤ n ≤ 10 ^ 5,1 ≤ m ≤ 2 × 10 ^ 6 的数据范围下,这种 O ( n ^ 2 × m ) 的方法显然会TLE

解决方法:ST表(ST:Sparse Table Algorithm)

ST表是一种能解决RMQ问题的算法,运用了常见的倍增思想,比较容易理解

我们使用数组 f [ i ] [ j ] 表示 a [ i ] 至 a [ i + 2 ^ j - 1 ] 中的最值

首先预处理 f 数组,代码如下:

    for(int i=1;i<=n;i++){
    	f[i][0]=a[i]; // f[i][0] 即 a[i] 至 a[i+2^0-1] 中的最值即 a[i]
    }
    for(int j=1;(1<<j)<=n;j++){ // 1<<j 即 2^j,
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值