ST表
ST表
- $O(logn * n)$ 预处理 $2*10^6 \approx 2^{21}$ $log2^{21} = 21$
- $O(1)$查询,不支持修改操作
- 例如用于静态区间最大最小值查询
预处理
询问区间$[L,R]$,最多使用2个预处理过的区间的并就能覆盖询问区间
$f(i,j)$表示区间$[i,i+2^j-1]$的最大值 ,,,, $2^j-1$即倍增的长度 ,,, $f(i,j) = max[i,i+2^j-1]$
$f(i,0) = a_i$
$f(i,j) = [i,i+2^j-1]$
$= [i,i+2^{j-1}-1] \cup [i+2^{j-1},i+2^j-1]$
$= [i,i+2^{j-1}-1] \cup [i+2^{j-1},i+2^{j-1}+2^{j-1}-1]$
注意到:
$[i+2^{j-1},i+2^{j-1}+2^{j-1}-1] = f(i+2^{j-1},j-1)$
$[i,i+2^{j-1}-1] = f(i,j-1)$
所以
$f(i,j) = max(f(i,j-1),f(i+2^{j-1},j-1))$
询问
询问区间$[l,r]$,则区间长度$len = l-r + 1$,
设$2^s = len = l-r+1$ -> $s = log(l-r+1)$
分成2部分
$[l,l+2^s-1] \cup [r-2^s+1,r] = [l,l+2^s-1] \cup [r-2^s+1,r-2^s+1 + 2^s-1]$
$= max(f(l,s),f(r-2^s+1,s))$
- $s=log(l-r)$,应该是恰好平分了查询区间 (
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!