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+2j−1 个数中间的最大值,很显然, 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(0≤k<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<s≤n,0≤t<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,j−1,fi+(1<<j)−1,j−1)
(其它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