關於st表的推導

2022-05-13 16:40:24 字數 885 閱讀 8388

#include using

namespace

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 using

namespace

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