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...