【st演算法簡介】
資訊學競賽中,經常會出現rmq問題,即求區間最大(小)值問題。那麼,我們該如何求解呢?st演算法橫空出世。
st演算法(sparse table,稀疏表)主要用於解決區間最值問題(即
rmq問題)。因為st演算法求解rmq問題時的時間複雜度只有o(nlogn),查詢時間複雜度為常數階o(1),所以我們還常稱
st演算法為tle的死敵
本題利用了st演算法求解,st演算法分預處理及詢問兩部分。要理解st演算法,首先要注意下文表述中的移位運算子 >>及<< 的優先順序比四則運算 +-*/ 的優先順序高。這樣就能理解 1<
(2)查詢
若給定查詢
區間 [x,y]
,若利用st演算法求此區間內的最大值。則需先求出最大的 k,使之滿足
2^k ≤ y-x+1
。在此基礎上,區間 [x,y]=[x,x+2^k-1]∪[y-2^k+1,y],則區間 [x,y] 內的最大值為 max(f[x][k],f[y-(1雖然這兩個區間有交集,但對於求區間最值來說沒有影響。
據上,利用st演算法查詢區間 [x,y] 的最大值,計算式如下:
k=log2(y-x+1)
max(f[x][k],f[y-(1<
【演算法**】
#includeusing namespace std;
const int maxn=100005;
const int maxm=20; //∵log(10^6)<20
int a[maxn];
int f[maxn][maxm]; //f[i][j]表示從i位起的2^j個數中的最大數
int main()
for(int j=1; j<=log2(n); j++)
for(int i=1; i+(1<
Sparse Table演算法 求解RMQ
sparse table演算法,簡稱st演算法,可以用來求解rmq 區間最值查詢 問題。rmq問題的形式一般是 存在乙個大陣列,要求對於給定的起點和終點,迅速回答出這段區間的最大值或最小值。樸素的方式是掃瞄起點到終點的所有數,維護其中的最值,這樣的複雜度是o n 2 的,速度太慢。st演算法是使用的...
RMQ問題 Sparse Table演算法
rmq引子 我們都知道求乙個陣列的最小值,可以用很樸素的o n 級別的演算法來求解。那麼,如果現在是求乙個陣列的任意連續子陣列的最小值呢?假設詢問q次,那麼總的時間複雜度為o q n 時間開銷很高!這就是今天所要介紹的rmq問題 range minimum query 然而,如果使用一些分治的思想,...
演算法 ST表
想學習一下lca倍增,先 水乙個黃題 學一下st表 這是乙個運用倍增思想,通過動態規劃來計算區間最值的演算法 求出區間最值 回答詢問 求出區間最值 用 f i j 來儲存從第 j 個點開始,向後 2 i 1 個點 共 2 i 個點 中的最值 包括本身 利用二分法的思想,將區間 j,j 2 i 1 平...