Sparse Table

RMQ

給定一個數列     ,詢問區間               的最小值是多少。

顯然暴力法預處理的複雜度是           ,查詢的複雜度是

A
AA
A[i ,\ j]
A[i, j]A[i ,\ j]
O(1)
O(1)O(1)
O(n)
O(n)O(n)
2 0 1 6 9 4 8 7
2 0 0 1 6 4 4 7
4 0 0 1 4 4
8 0

想法是欲處理的時候建立一個二維陣列    ,其中         表示數列第     到               的最小值

D
DD
D_{i, j}
Di,jD_{i, j}
i
ii
i+2^{j}
i+2ji+2^{j}
D_{i+1, j}=min\{D_{i, j},D_{i,j+2^{i}} \}
Di+1,j=min{Di,j,Di,j+2i}D_{i+1, j}=min\{D_{i, j},D_{i,j+2^{i}} \}

預處理複雜度

O(nlogn)
O(nlogn)O(nlogn)

查詢           ,先求

[l, r]
[l,r][l, r]
p=\lfloor log_{2}(l-r+1)\rfloor
p=log2(lr+1)p=\lfloor log_{2}(l-r+1)\rfloor

於是答案是

min\{D_{p,l},D_{p,r-2^{p}}\}
min{Dp,l,Dp,r2p}min\{D_{p,l},D_{p,r-2^{p}}\}

複雜度

O(1)
O(1)O(1)

BIT

動態前綴和

給一個數列     ,要求可以修改       至

或詢問              的值
 

A
AA
A_i
AiA_i
A_i+k
Ai+kA_i+k
\sum\limits_{i=l}^{r}A_{i}
i=lrAi\sum\limits_{i=l}^{r}A_{i}

deck

By hfy880916

deck

  • 356