st表是解決 rmq (range minimum/maximum query) 靜態區間最值查詢問題的離線資料結構。其預處理時間複雜度為 o(nlogn) ,查詢時間複雜度為 o(1),n為序列長度。rmq 問題也可以用線段樹來解決,只不過線段樹的查詢複雜度為 o(nlogn) 而且**量大。
本文以求最小值為例。
演算法利用了二分和動態規劃的思想:
設 st[i][j] 表示區間 [i,i+2^j-1] 內的最小值。
例:對於序列 3,2,4,5,6,8,1,2,9,7
則:st[1][0]=3,st[1][1]=2,st[1][2]=2,st[1][3]=1 。
也就是第 i 個數起,連續 2^j 個數中的最小值。
st[i][j] 的轉移方程:
st[i][j] = min( st[i][j-1] ,st[i+(1<<(j-1))][j-1] )
注意其中 j 是階段,i 是狀態,所以迴圈中 j 放在外層。
void init_st()
{ for(int j=1;j<=floor(log(n)/log(2));j++)
for(int i=1;i+(1《預先需要令 st[i][0]=a[i] 。 a 是原序列,這個式子同樣符合 st 的定義。查詢
查詢時,用兩個長度為 2^ k 的區間覆蓋待查詢區間,而長度為 2^ k 的區間最值可以直接從 st陣列 中得到。
其中 k = floor(log(b-a+1)/log(2))
即 2^k = b-a+1 向下取整。
區間 [a,b] 的最小值為 min(st[a][k],st[b-2^k+1][k])
init_st();
for(int i=1;i<=m;i++)
{ int a, b, k, ans;
scanf("%d%d", &a, &b); //輸入查詢區間
k = floor(log(b-a+1)/log(2));
ans = min(st[a][k], st[b-(1《模板: 洛谷p3865 【模板】st表.
另乙個模板,我自己用線段樹做了一遍:洛谷p2880 [usaco07jan]balanced lineup g.
資料結構 資料結構緒論
資料結構是相互間存在一種或多種特定關係的資料元素的集合。程式設計 資料結構 演算法 資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。資料元素是組成資料的 有一定意義的基本單位,是計算機中通常作為整體處理,也被稱為記錄。乙個資料元素可以由若干個資料項組...
資料結構 資料結構演算法
分治法 對於乙個規模為n的問題,若該問題可以容易地解決 比如說規模n較小 則直接解決 否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。動態規劃法 這種演算法也用到了分治思想,它的做法是將問題例項分解為更小的 相似的子...
資料結構 01 資料與資料結構
1.資料data 資料是描述客觀事物的符號,是計算機中可以操作的物件,是能被計算機識別,並輸入給計算機處理的符號集合。2.資料元素data elements 資料元素是組成資料的 有一定意義的基本單位,在計算機中通常作為整體進行處理。3.資料物件data object 資料物件是性質相同的資料元素的...