ST表 (求區間最大 最小值)

2021-09-17 22:31:50 字數 668 閱讀 1576

st表的功能很簡單

它是解決rmq問題(區間最值問題)的一種強有力的工具

它可以做到o(nlogn)預處理,o(1)是查詢最值

像線段樹是o(logn)的查詢

st表是利用的是倍增的思想

拿最大值來說

我們用st[i][j]表示,從i位置開始的2^j個數中的最大值,例如st[i][1]表示的是i位置和i+1位置中兩個數的最大值

那麼轉移的時候我們可以把當前區間拆成兩個區間並分別取最大值(注意這裡的編號是從1開始的)

查詢的時候也比較簡單

我們計算出log2(​區間長度)

然後對於左端點和右端點分別進行查詢,這樣可以保證一定可以覆蓋查詢的區間

剛開始學的時候我不太理解為什麼從右端點開始查的時候左端點是r-2^k+1r−2k+1

實際很簡單,因為我們需要找到乙個點x,使得x+2^k-1=r

這樣的話就可以得到x=r−2^k+1

#includeusing namespace std;

const int n=1e6+10;

int st[n][21];

int query(int l,int r)

int main()

} while(m--)

return 0;

}

區間最大最小值 ST表

這是一道st表經典題 靜態區間最大值 請注意最大資料時限只有0.8s,資料強度不低,請務必保證你的每次查詢複雜度為 o 1 o 1 若使用更高時間複雜度演算法不保證能通過。如果您認為您的 時間複雜度正確但是 tle,可以嘗試使用快速讀入 inline int read while isdigit c...

st表求區間最大值

第一行給出乙個數字n,接下來n 1行,每行給出乙個數字ai,0 i n 1e6 接來給出乙個數字q q 7000 代表有q個詢問 每組詢問格式為a,b即詢問從輸入的第a個數到第b個數,其中的最大值是多少 如題所述 1001 2323 4321 050 10 2 43 7 7 98 8 434 32這...

分組求最大最小值

按某一欄位分組取最大 小 值所在行的資料 資料如下 name val memo a 2 a2 a的第二個值 a 1 a1 a的第乙個值 a 3 a3 a的第三個值 b 1 b1 b的第乙個值 b 3 b3 b的第三個值 b 2 b2b2b2b2 b 4 b4b4 b 5 b5b5b5b5b5 建立表...