浅谈倍增与ST表

如果我们有一个长度为 n n n 的数组 a a a,现在有 q q q 次询问,每次询问区间 [ l , r ] [l,r] [l,r] 的最大值。应该怎么做? ( n , q ≤ 2 × 1 0 5 ) (n,q \leq 2 \times 10^5) (n,q2×105)

如果暴力,就是 Θ ( n 2 ) \Theta(n^2) Θ(n2) 的,显然行不通。这时,就要用到ST表。

ST表是一种基于倍增思想的数据结构,支持对于一个数组无修改、区间修询问的大部分操作。接下来讲解一下他的运行过程。

Part 1:预处理ST表

f [ i ] [ j ] f[i][j] f[i][j] 表示 a a a 数组区间 [ i , i + 2 j ) [i,i+2^j) [i,i+2j) 的最大值。此时,我们可以运用类似DP的思想计算:

  • 初始化: ∀ i ∈ [ 1 , n ] , f [ i ] [ 0 ] = a [ i ] \forall i \in [1,n],f[i][0]=a[i] i[1,n],f[i][0]=a[i]
  • 运算顺序:优先从小到大枚举 j j j i i i 的枚举顺序任意。
  • 状态转移方程: f [ i ] [ j ] = max ⁡ ( f [ i ] [ j − 1 ] , f [ i + 2 j − 1 ] [ j − 1 ] ) f[i][j]=\max(f[i][j-1],f[i+2^{j-1}][j-1]) f[i][j]=max(f[i][j1],f[i+2j1][j1])

此时,时间复杂度与空间复杂度均为 Θ ( n log ⁡ n ) \Theta(n \log n) Θ(nlogn)

Part 2:求询问

这里就运用了倍增思想。对于一个询问区间 [ l , r ] [l,r] [l,r],我们可以将他分成若干段,使得每段的长度都可以表示为 2 i 2^i 2i,这样再利用数组 f f f 就可以求出答案。


因此我们从大到小枚举 i i i ( i ≥ 0 ) (i\geq 0) (i0)

  • 如果 r − l + 1 ≤ 2 i r-l+1 \leq 2^i rl+12i,则 a n s = max ⁡ ( a n s , f [ l ] [ i ] ) ans=\max(ans,f[l][i]) ans=max(ans,f[l][i]),随后 l → l + 2 i l \to l+2^i ll+2i
  • 否则什么也不做

最终我们能够得出答案。单次询问时间复杂度 Θ ( log ⁡ n ) \Theta(\log n) Θ(logn)

例题:

洛谷 P3865 【模板】ST 表
洛谷 P2251 质量检测

总结:倍增十分巧妙的运用了一个数可以分解为多个2的k次方数的特性,而ST表则是运用了倍增思想从而做到快速求解区间询问问题。

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值