概述:用倍增法求區間最值的離線演算法,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例題:poj - 3264],a[n];
void init_st(int
n) }
}int query(int l,int
r)
思路:求區間最值差
**:
#include#includeview code#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;
}
參考:
演算法 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 起始位...