區間最值的優秀資料結構 ST表

2022-07-13 20:57:28 字數 1166 閱讀 6425

st表,聽起來高大上,實際上限制非常多,僅僅可以求最值問題;

為什麼?先從原理看起;

st表運用了倍增的思想:st[i][j] = min(st[i][j - 1],st[i + 2^(j - 1))][j - 1]);

意義是:從i開始向後連續2^j個位置的最大值是,i開始向後連續2^(j-1)個位置的最大值和i+2^(j-1)開始向後連續2^(j-1)個位置的最大值;

好了,結構建立起來了,那麼怎麼查詢呢?

乙個公式:2^log(a)>a/2

所以說,查詢(x,y)時我們設k=log(y-x+1);

ans=max(f[x][k],f[y-(1<

現在我們知道了,st表只能求最值的原因是它在查詢時,為了節約時間複雜度而導致查詢區間取並集操作;這樣求區間和便無法得到正確答案;

附:1.求一維st最值:

#include #define int long long

using namespace std;

int a[100010];

int f[100010][40],g[100010][40];

int n,q;

void build()

for(register int j=1;(1《而二維st表原理就是將乙個正方形分成了4份:

令 st[i][j][k]表示左上角為i,j,邊長為k的正方形中的最大值。

st[i][j][k]=max(st[i][j][k-1],st[i+(1<

查詢時與一維st表類似,取並集操作;

#include #define inc(i,a,b) for(register int i=a;i<=b;i++)

using namespace std;

int a,b,n;

int mmap[1001][1001];

int f[1001][1001][8],g[1010][1010][8];

void build()

} for(int k=1;k<=7;k++){

for(int i=1;i+(1《在做一維和二維st表的時候,我們可以自己推出:三維的st表,甚至於四維的st表;只不過由於他們的時間複雜度較高,記憶體需求較大,我們便不再需要他們了。但這種思維可以運用到別的地方。

ST表演算法(求解區間最值)

如下 bin 0 1 for int i 1 i 20 i bin i bin i 1 2 bin i 表示2的i次方 log 0 1 for int i 1 i 200000 i log i log i 2 1 log i 表示log i for int i 1 i n i mn 0 i a i ...

ST表(RMQ問題 區間最值查詢

3 2 4 5 6 8 1 2 9 7 預處理,用dp解決。設a i 是要求區間最值的數列,dp i,j 表示從第i個數起連續2 j個數中的最大值。dp 1,0 表示第1個數起,長度為2 0 1的最大值,其實就是3這個數。dp 1,2 5,dp 1,3 8,dp 2,0 2,dp 2,1 4 可以看...

求解區間最值的ST演算法

作用 st演算法是用來求解給定區間rmq的最值,本文以最小值為例 舉例 給出一陣列a 0 5 則區間 2,5 之間的最值為1。1 離線預處理 運用dp思想,用於求解區間最值,並儲存到乙個二維陣列中。具體解釋 1 離線預處理 st演算法使用dp思想求解區間最值,貌似屬於區間動態規劃,不過區間在增加時,...