#include usingnamespace
std;
const
int maxn=1e6+7
;int st[maxn][32
];int
a[maxn],n;
void
init()
}}int querymin(int l,int
r)int
main()
init();
scanf("%d
",&q);
for(i=0;ii)
}return0;
}
上面這個^符號代表冪次。。而c++裡只有異或。。這就是為什麼這是乙個偽**的意思
先來乙個終極偽**
推導過程如上。。
下面給乙個真正的的**
#include usingnamespace
std;
const
int maxn=1e6+7
;int st[maxn][32
];int
a[maxn],n;
void
init()
}}int querymin(int l,int
r)int
main()
init();
scanf("%d
",&q);
for(i=0;ii)
}return0;
}
還有乙個對於新手來說理解的坑。。那就是int x=log(val)實際上是對log的值向下取整。。這一點非常重要
只有這個成立我們注釋裡的推導才會成立。。另外有一些沒用的推導。。但是我沒有刪掉。。這是因為想記錄一下我全部的思考過程
ST表的學習
st表的優勢在於可以把查詢乙個區間的最值的時間複雜度降為o n o n o n 假設有乙個陣列裡有10000個元素,第i個元素記為ar i 我們用f i j 表示從第i個元素開始,向右i 2j 1的 這些元素的最大值。有f i j max f i j 1 f i 2j 1 j 1 這其實是把區間 i...
ST表(倍增表)
介紹st表之前先看看rmq問題是什麼東西吧 rmq range maximum minimum query 顧名思義,這就是指區間最大或最小值 區間最值 st表 spars table,一種可以解決rmq的,基於倍增的資料結構 令 f i j 表示從 i 開始連續 2 j 個數中的最值,如果 i 後...
演算法 ST表
想學習一下lca倍增,先 水乙個黃題 學一下st表 這是乙個運用倍增思想,通過動態規劃來計算區間最值的演算法 求出區間最值 回答詢問 求出區間最值 用 f i j 來儲存從第 j 個點開始,向後 2 i 1 個點 共 2 i 個點 中的最值 包括本身 利用二分法的思想,將區間 j,j 2 i 1 平...