Loading docs/ds/sparse-table.md +10 −6 Original line number Diff line number Diff line ## 简介 ST 表是用于解决 **可重复贡献问题** 的数据结构,例如区间 RMQ。 ST 表是用于解决 **可重复贡献问题** 的数据结构。 ??? note:"什么是可重复贡献问题?" **可重复贡献问题** 是指对于运算 $\operatorname{opt}$,满足 $x\operatorname{opt} x=x$,则对应的区间询问就是一个可重复贡献问题。例如,最大值有 $\max(x,x)=x$,gcd 有 $\operatorname{gcd}(x,x)=x$,所以 RMQ 和区间 GCD 就是一个可重复贡献问题。像区间和就不具有这个性质,如果求区间和的时候采用的预处理区间重叠了,则会导致重叠部分被计算两次,这是我们所不愿意看到的。另外, $\operatorname{opt}$ 还必须满足结合律才能使用 ST 表求解。 ??? note:"什么是RMQ?" RMQ 是英文 Range Maximum/Minimum Query 的缩写,表示区间最大(最小)值。解决 RMQ 问题有很多种方法,可以参考 [RMQ 专题](../topic/rmq.md) 。 ## 引入 Loading @@ -20,15 +24,15 @@ ST 表基于 [倍增](../basic/binary-acc.md) 思想,可以做到 $\Theta(n\lo 基于倍增思想,我们考虑如何求出区间最大值。可以发现,如果按照一般的倍增流程,每次跳 $2^i$ 步的话,询问时的复杂度仍旧是 $\Theta(\log n)$ ,并没有比线段树更优,反而预处理一步还比线段树慢。 但是,我们发现 $\max(x,x)=x$ ,也就是说,区间最大值是一个具有“可重复贡献”性质的问题,也就是说,即使用来求最大值的预处理区间有重叠部分,只要这些区间的并是所求的区间,最终计算出的答案就是正确的。像区间和就不具有这个性质,如果求区间和的时候采用的预处理区间重叠了,则会导致重叠部分被计算两次,这是我们所不愿意看到的。 我们发现 $\max(x,x)=x$ ,也就是说,区间最大值是一个具有“可重复贡献”性质的问题。即使用来求解的预处理区间有重叠部分,只要这些区间的并是所求的区间,最终计算出的答案就是正确的。 如果手动模拟一下,可以发现我们能使用至多两个预处理过的区间来覆盖询问区间,也就是说,询问时的时间复杂度被降至 $\Theta(1)$ ,在处理有大量询问的题目时十分有效。 如果手动模拟一下,可以发现我们能使用至多两个预处理过的区间来覆盖询问区间,也就是说询问时的时间复杂度可以被降至 $\Theta(1)$ ,在处理有大量询问的题目时十分有效。 具体实现如下: 令 $f(i,j)$ 表示区间 $[i,i+2^j-1]$ 的最大值。 显然, $f(i,0)=a_i$ 。 显然 $f(i,0)=a_i$ 。 根据定义式,第二维就相当于倍增的时候“跳了 $2^j-1$ 步”,依据倍增的思路,写出状态转移方程: $f(i,j)=\max(f(i,j-1),f(i+2^{j-1},j-1))$ 。 Loading @@ -40,7 +44,7 @@ ST 表基于 [倍增](../basic/binary-acc.md) 思想,可以做到 $\Theta(n\lo 其中 $s=\left\lfloor\log_2(r-l+1)\right\rfloor$ 。 根据上面的论证,由于最大值是“可重复贡献问题”,重叠并不会对区间最大值产生影响。又因为这两个区间完全覆盖了 $[l,r]$ ,可以保证答案的正确性。 根据上面对于“可重复贡献问题”的论证,由于最大值是“可重复贡献问题”,重叠并不会对区间最大值产生影响。又因为这两个区间完全覆盖了 $[l,r]$ ,可以保证答案的正确性。 ## 模板代码 Loading Loading
docs/ds/sparse-table.md +10 −6 Original line number Diff line number Diff line ## 简介 ST 表是用于解决 **可重复贡献问题** 的数据结构,例如区间 RMQ。 ST 表是用于解决 **可重复贡献问题** 的数据结构。 ??? note:"什么是可重复贡献问题?" **可重复贡献问题** 是指对于运算 $\operatorname{opt}$,满足 $x\operatorname{opt} x=x$,则对应的区间询问就是一个可重复贡献问题。例如,最大值有 $\max(x,x)=x$,gcd 有 $\operatorname{gcd}(x,x)=x$,所以 RMQ 和区间 GCD 就是一个可重复贡献问题。像区间和就不具有这个性质,如果求区间和的时候采用的预处理区间重叠了,则会导致重叠部分被计算两次,这是我们所不愿意看到的。另外, $\operatorname{opt}$ 还必须满足结合律才能使用 ST 表求解。 ??? note:"什么是RMQ?" RMQ 是英文 Range Maximum/Minimum Query 的缩写,表示区间最大(最小)值。解决 RMQ 问题有很多种方法,可以参考 [RMQ 专题](../topic/rmq.md) 。 ## 引入 Loading @@ -20,15 +24,15 @@ ST 表基于 [倍增](../basic/binary-acc.md) 思想,可以做到 $\Theta(n\lo 基于倍增思想,我们考虑如何求出区间最大值。可以发现,如果按照一般的倍增流程,每次跳 $2^i$ 步的话,询问时的复杂度仍旧是 $\Theta(\log n)$ ,并没有比线段树更优,反而预处理一步还比线段树慢。 但是,我们发现 $\max(x,x)=x$ ,也就是说,区间最大值是一个具有“可重复贡献”性质的问题,也就是说,即使用来求最大值的预处理区间有重叠部分,只要这些区间的并是所求的区间,最终计算出的答案就是正确的。像区间和就不具有这个性质,如果求区间和的时候采用的预处理区间重叠了,则会导致重叠部分被计算两次,这是我们所不愿意看到的。 我们发现 $\max(x,x)=x$ ,也就是说,区间最大值是一个具有“可重复贡献”性质的问题。即使用来求解的预处理区间有重叠部分,只要这些区间的并是所求的区间,最终计算出的答案就是正确的。 如果手动模拟一下,可以发现我们能使用至多两个预处理过的区间来覆盖询问区间,也就是说,询问时的时间复杂度被降至 $\Theta(1)$ ,在处理有大量询问的题目时十分有效。 如果手动模拟一下,可以发现我们能使用至多两个预处理过的区间来覆盖询问区间,也就是说询问时的时间复杂度可以被降至 $\Theta(1)$ ,在处理有大量询问的题目时十分有效。 具体实现如下: 令 $f(i,j)$ 表示区间 $[i,i+2^j-1]$ 的最大值。 显然, $f(i,0)=a_i$ 。 显然 $f(i,0)=a_i$ 。 根据定义式,第二维就相当于倍增的时候“跳了 $2^j-1$ 步”,依据倍增的思路,写出状态转移方程: $f(i,j)=\max(f(i,j-1),f(i+2^{j-1},j-1))$ 。 Loading @@ -40,7 +44,7 @@ ST 表基于 [倍增](../basic/binary-acc.md) 思想,可以做到 $\Theta(n\lo 其中 $s=\left\lfloor\log_2(r-l+1)\right\rfloor$ 。 根据上面的论证,由于最大值是“可重复贡献问题”,重叠并不会对区间最大值产生影响。又因为这两个区间完全覆盖了 $[l,r]$ ,可以保证答案的正确性。 根据上面对于“可重复贡献问题”的论证,由于最大值是“可重复贡献问题”,重叠并不会对区间最大值产生影响。又因为这两个区间完全覆盖了 $[l,r]$ ,可以保证答案的正确性。 ## 模板代码 Loading