ST表-------学习笔记

简介

ST表用于解决RMQ问题和可重复贡献问题

RMQ

Range Maximum(Minimum) Query的缩写,顾名思义就是某区间内的最大值或最小值

可重复贡献问题

可重复贡献子问题是指对于运算opt,满足x opt x=x,则对应的区间询问就可以是一个可重复贡献子问题。
例如,最大值有max(x,x)=x,gcd有gcd(x,x)=x,所以RMQ问题和区间GCD问题就是一个可重复贡献问题。
像区间和就不具有这个性质,如果求区间和的时候采用的预处理区间重叠了,则会导致重叠部分被计算两次,这是我们不愿看到的。另外,opt还必须满足结合律才能使用ST表求解。

引入

模板题
题目大意:给定n个数,有m个询问,对于每个询问,你需要回答区间[l,r]中的最大值。
如果使用暴力做法。每次对区间[l,r]扫一遍,求出最大值显然会超时。

ST表

ST表基于倍增思想,可以做到O(nlogn)预处理,O(1)回答每个问题,但是不支持修改操作。
基于倍增思想,我们考虑如何求出区间最大值。可以发现,如果按照一般的倍增流程,每次跳2i步的话,询问时的复杂度仍旧是O(logn),并没有比线段树更优,反而预处理一步还比线段树慢。
我们发现 max(x,x)=x,也就是说区间最大值是一个具有“可重复贡献”性质的问题。即使用来求解的预处理区间有重叠部分,只要这些区间的并集是所求的区间,最终计算出的答案就是正确的。
如果手动模拟一下,可以发现我们能使用至多两个预处理过的区间来覆盖询问区间,也就是说询问时的时间复杂度可以被降至O(1),在处理有大量询问的题目时十分有效。

实现
1.预处理

用a[1…n]表示一组数。设f[i,j]表示从a[i]到a[i+2j-1]这个范围内的最大值,也就是以a[i]为起点连续2j个数的最大值。由于元素的个数为2j个所以从中间平均分成两部分,每一部分的元素个数刚好为2j-1个,也就是说,把f[i,j]分为f[i,j-1]和f[i+2j-1,j-1],如图:
在这里插入图片描述
整个区间的最大值一定是左右两部分的最大值中的较大值,分析得出:f[i][j]=max(f[i][j-1],f[i+2j-1][j-1]),边界条件为f[i][0]=a[i]。
这样就可以在O(nlogn)的时间复杂度内预处理f数组。

2.询问

若我们要询问区间[li,ri]的最大值,则先求出最大的x满足2x<=ri-li+1,那么区间[li,ri]=[li,li+2x-1]U[ri-2x+1,ri],如图:
在这里插入图片描述
两个区间

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值