ST表(倍增表)

2022-09-21 12:30:10 字數 1234 閱讀 6351

介紹st表之前先看看rmq問題是什麼東西吧

rmq: range maximum/minimum query

顧名思義,這就是指區間最大或最小值(區間最值)

st表:spars table,一種可以解決rmq的,基於倍增的資料結構

令 \(f[i][j]\) 表示從 \(i\) 開始連續 \(2^j\) 個數中的最值,如果 \(i\) 後面的數不足 \(2^j\) 個則全取

\[ f[i][j]=\left\

&min/max(f[i][j-1],f[i+2^][j-1])& &,& &j>0,i+2^\leq n&\\

&f[i][j-1]& &,& &j>0,i+2^>n&\\

&a[i]& &,& &j=0&

\end\right.\]

*\(f\) 陣列可以遞推得到

**:

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

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

for(int i=1;i<=n-(1<時間複雜度: \(o(nlog(n))\)

詢問區間為 \([l,r]\) ,設 \(x=\lfloor\rfloor\) ,則區間 \([l,l+2^x-1]\) 和 區間 \([r-2^x+1,r]\) 一定覆蓋了 \([l,r]\) 這個區間內所有元素

所以答案為:\(min(f[l][x],f[r-2^x-1][x])\)

小優化:對於 \(1\) ~ \(n\) 每乙個數先預處理 \(log(x)\) 下取整的結果,每次訊問時即為 \(o(1)\) 的複雜度

**:

lg[0]=-1;

for(int i=1;i<=n;i++) lg[i]=lg[i/2]+1;

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

int le,r;

scanf("%d%d",&le,&r);

int x=r-le+1;

printf("%d\n",max(f[le][lg[x]],f[r-(1《幾道練手題:

模板題另一道模板題 (貌似樹狀陣列和線段樹也能做)

需要思考一下的題:

序列foutain

真香筆記 倍增 st表

倍增 是什麼 一種非隨機的節省操作的思想 為什麼 節省時間 怎麼弄 將一步一步走轉化為20步 21步 22步 23步 走 應用 1 快速冪 由於11 1 23 0 22 1 21 1 20,故快速冪演算法計算311 38 32 31 具體怎麼算我不是很熟,貌似最大就只用算到8次方所以得出節省時間的結...

2022 2 25 倍增思想和ST表

倍增 將線性級轉換成對數級,降低時間複雜度 只考慮二的整數冪次,縮小查詢範圍。運用 1.快速冪 算n的m次方,log n 遞推法 int ans 1 while n 2.rmq問題 n個數字m次詢問,每次 l,r 中最大值 運用st表,預處理 o nlogn 查詢o 1 想法是將每次要查詢的區間的最...

演算法 ST表

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