st 表演算法模板

2021-08-26 09:15:53 字數 1194 閱讀 6683

借鑑於:

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),起始位置為j+2^(i-1)。 那麼後半段的狀態表示為st[i-1][j+2^(i-1)]。

所以: st[i][j]=min(st[i-1][j],st[i-1][j+2^(i-1)]。

那麼預處理部分結束了,看看查詢部分

有個公式,就是2^log(len)>len/2;而len=r-l+1; len為區間查詢長度

查詢l到r的區間最值,min(從l往後2^t的最小值,從r往前2^t的最小值)

t=log[len],

而前多半部分就是st[t][l],

設m+2^len-1=r;m為開始下標

所以 m=r-2^len+1;

後半部分:st[t][r-2^len+1]

int t=log[r-l+1];

printf("%d\n",min(st[t][l],st[t][r-2^t+1]));

#include

#include

using

namespace

std;

int n;

const

int n=1000;

intlog[n];

int stmin[n][n],stmax[n][n];

int a[n];

int bin[n];

void init()

for(int i=1;i<=n;i++)

for(int i=1;i<=n;i++)

for(int i=1;i<=log[n];i++)

}}int rmq_max(int l,int r)

int rmq_min(int l,int r)

int main()

init();

int x,y;

scanf("%d%d",&x,&y);

printf("%d\n",rmq_min(x,y));

}

演算法模板 ST表

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

演算法 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...