基礎演算法 ST表 入門 C

2022-05-11 16:24:27 字數 964 閱讀 5162

學了樹狀陣列看到st表模板躍躍欲試的時候發現完全沒思路,因為給出的查詢的時間實在太短了!幾乎是需要完成o(1)查詢。所以st表到底是什麼神仙演算法能夠做到這麼快的查詢?

st表是乙個用來解決rmq問題(區間最值問題)的有效演算法。

它的功能也很簡單。

o(nlogn)預處理,o(1)查詢區間最值。

其他好像真還沒什麼用了

st表利用的是倍增的思路來實現的。

怎麼說呢,st表確實很神奇。

拿最大值來說吧...

我們用f[i][j]表示第i個數開始的\(2^j\)個數中的最大值。

p.s. 下面的圖是這個大佬畫的

轉移的時候我們可以把當前區間拆成兩個區間並分別取最大值(注意這裡的編號是從1開始的)

查詢也比較簡單;

首先要計算\(log_2\)(區間長度)

然後分別查詢左右段店,保證覆蓋整個區間。

p.s因為我們需要找到乙個點x使得\(x+2^k-1=r\),然後移項就可以得到\(x=r-2^k+1\),所以把x作為從右端點查詢的區間的左端點,也就是\(r-2^k+1\)。

**就比較好理解了...

#includeusing namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}int f[100001][40],b,n,m,p,l,r;

int main()

{ n=read(),m=read();

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

f[i][0]=read();

b=(int)(log(n)/log(2));

for(int j=1;j<=b;j++)

for(int i=1;i<=n-(1

演算法 ST表

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

ST(稀疏表)演算法

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

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 起始位...