ST表

ST表(sparse-table)是一种代码极其短的数据结构,RMQ(Range Minimum Qustion,范围最小值问题)专用。

RMQ就是给你一个序列不断询问你给定区间内的最小值。

ST表只能解决静态的RMQ,动态的需要用到万能的常数贼大的线段树。

链接

ST表基本思想: d [ i ] [ j ] d[i][j] d[i][j] 表示以 i i i 为起点,长度为 2 j 2^j 2j 这一段区间中的最小值。

例如, d [ 3 ] [ 2 ] d[3][2] d[3][2] 就是 3 ∼ 3 + 2 2 3\sim 3+2^2 33+22 区间,即 3 ∼ 7 3\sim 7 37 区间的最小值。

ST表初始化代码:

for (register int i(1); i <= n; ++ i) d[i][0] = a[i] = read();
for (register int i(n); i >= 1; -- i)
for (register int j(1); i + (1 << j - 1) <= n; ++ j)
d[i][j] = max(d[i][j - 1], d[i + (1 << j - 1)][j - 1]);

由于本身ST表解决问题范围有很大的局限性上述代码可以直接背。

原理用一张图就可以说明了:

在这里插入图片描述
我们要算出 d [ i ] [ j ] d[i][j] d[i][j] 的值,也就是 i ∼ i + 2 j i\sim i+2^j ii+2j

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值