ST表------解决区间不可重复贡献问题

ST表------解决区间不可重复贡献问题

在阅读本文章之前,请确保您有足够的ST表基础。

1、ST表的概念

普通的ST表是能够解决RMQ(可重复贡献问题)的数据结构,能够在 O ( n l o g n ) O(n log n) O(nlogn)时间复杂度预处理,在 O ( 1 ) O(1) O(1)时间复杂度回答每个询问,遗憾的是不能解决带修改的RMQ问题,也不能解决区间可重复贡献问题。

2、ST表的实现

我们以区间最大值为例:
首先,规定 f i , j f_{i,j} fi,j 表示从 i i i 开始,到第 i + 2 j − 1 i+2^j-1 i+2j1 个数中间的最大值,很显然, f i , 0 f_{i,0} fi,0 就是 当前的数组中下标为 i i i 的值(方便起见,以后简称 a i a_i ai)。那么我们怎么转移呢?要想得知 f i , j f_{i,j} fi,j 的值,而且必须 O ( 1 ) O(1) O(1) 时间内转移过来,我们首先规定两个前提:

1、计算到 f i , j f_{i,j} fi,j 时,所有 f i , k ( 0 ≤ k < j ) f_{i,k}(0 \le k < j) fi,k(0k<j) 都已经计算过。
2、计算到 f i , j f_{i,j} fi,j 时,所有 f s , t ( i < s ≤ n , 0 ≤ t < j ) f_{s,t}(i < s \le n,0 \le t < j) fs,t(i<sn,0t<j) 都已经计算过。

满足第一个前提,我们可以递增 j j j 来计算;满足第二个前提,我们可以递减 i i i 来计算,这样,状态转移方程就可以列举出来了。
f i , j = m a x ( f i , j − 1 , f i + ( 1 < < j ) − 1 , j − 1 ) f_{i,j} = max(f_{i,j-1},f_{i+(1<<j)-1,j-1}) fi,j=max(fi,j1,fi+(1<<j)1,j1)
(其它RMQ问题同理,如区间 g c d gcd gcd ,则把 m a x ( ) max() max() 改为 g c d ( ) gcd() gcd() 即可)

3、如何解决区间不可重复贡献问题

1、分析

这里以解决区间异或和作为例子。
题目大意:

   给你一个长度为 n n n 的数组 a a a ,和 m m m 次询问 l i , r i ( l i ≤ r i ) l_i ,r_i(l_i \le r_i) li,r

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值