演算法模板 ST表

2022-05-25 22:33:09 字數 726 閱讀 5970

st表和線段樹一樣,都能解決rmq問題(範圍最值查詢-range minimum query)。

我們開乙個陣列陣列\(f[maxn][maxn\log_2]\)來儲存資料。

定義\(f[i][j]\)代表從\(i\)開始的\(2^\)位這個區間的最大值。

因為\(f[i][0]=a[i]\),所以有:

\[f[i][j]=max(f[i][j-1],f[i+2^][j-1])

\]通過這個轉移方程即可構造出\(f\)。

查詢區間\([l,r]\)的最大值。

令\(k=\log _2(l-r+1)\),那麼很容易想明白:

\[ans=max(f[l][k],f[r-2^k+1][2^k])

\]注意定義\(f\)的時候,\(i\)是包含在\(2^k\)裡面的,所以可能會+1/-1。

#include#include#include#includeusing namespace std;

#define maxn (int)(1e5+1000)

int a[maxn],f[maxn][21],n,m;

void init()

} return;

}int query(int l,int r)

int main()

init();

for(int i=1;i<=m;i++)

return 0;

}

st 表演算法模板

借鑑於 st表是基於二分的思想,st i j 表示j到j 2 n 1區間內的最值,長度為2 n 構建的時候用二分構建,那麼st i j 如何用其他狀態來繼承呢?j到j 2 i 1的長度為2 i,那麼一半的長度就等於2 i 1 那麼前半段的狀態表示為st i 1 j 後半段的長度也為2 i 1 起始位...

演算法 ST表

想學習一下lca倍增,先 水乙個黃題 學一下st表 這是乙個運用倍增思想,通過動態規劃來計算區間最值的演算法 求出區間最值 回答詢問 求出區間最值 用 f i j 來儲存從第 j 個點開始,向後 2 i 1 個點 共 2 i 個點 中的最值 包括本身 利用二分法的思想,將區間 j,j 2 i 1 平...

RMQ之ST演算法模板

1 include2 include 3 include4 using namespace std 5const int n 1e6 111 6 int max n 21 min n 21 a n 7void st int a,int n 預處理,o nlogn 820 21 22 23int lo...