演算法筆記 st表

2022-03-05 05:03:18 字數 953 閱讀 4649

概述:用倍增法求區間最值的離線演算法,o(nlogn)預處理,o(1)訪問。

預處理:

狀態:st[i][j]:[i,i+2^j)之間的最值  

狀態轉移:如果j等於0,st[i][j]=a[i]

如果j大於0,st[i][j]=max(st[i][j-1],st[i+2^(j-1)][j-1])或st[i][j]=min(st[i][j-1],st[i+2^(j-1)][j-1])

訪問:求[l,r]區間裡的最值

k=floor(log(r-l+1))

ans=max(st[l][k],st[r-2^k+1][k])或ans=min(st[l][k],st[r-2^k+1][k])

模板:

int st[n][20

],a[n];

void init_st(int

n) }

}int query(int l,int

r)

例題:poj - 3264

思路:求區間最值差

**:

#include#include

#include

#include

#include

using

namespace

std;

#define ll long long

#define pb push_back

#define mem(a,b) memset(a,b,sizeof(a))

const

int n=1e5+5

;int ss[n][20],st[n][20

],a[n];

void init_st(int

n) }

}int query(int l,int

r)int

main()

return0;

}

view code

參考:

演算法 ST表

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

ST(稀疏表)演算法

作用 st演算法是用來求解給定區間rmq的最值,本文以最小值為例 舉例 給出一陣列a 0 5 則區間 2,5 之間的最值為1。1 離線預處理 運用dp思想,用於求解區間最值,並儲存到乙個二維陣列中。具體解釋 1 離線預處理 st演算法使用dp思想求解區間最值,貌似屬於區間動態規劃,不過區間在增加時,...

st 表演算法模板

借鑑於 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 起始位...