學了樹狀陣列看到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 起始位...