學習記錄 ST表

2022-09-14 07:15:10 字數 1151 閱讀 3331

st 表是用於解決可重複貢獻問題的資料結構

可重複貢獻問題:是指對於運算\(opt\),滿足\(x\ opt\ x =x\),則對應的區間詢問就是乙個可重複貢獻問題。(摘自oi wiki)

說人話,就是對區間的重複運算不影響結果。比如區間最值問題(rmq),區間gcd

比方10個數求最大值,先對前7個數求最值,再對後6個數求最值,中間有一段重複沒有關係,最後再對求出的兩個最值再求一次最值,這種方法是正確的。

按照第一段的話說,就是

\[max(1,2,...,10)=max(\ max(1,2,...,7)\ ,\ max(4,5,...,10)\ )

\]

st表主要運用了倍增的思想,可以做到\(o(nlog_2n)\)預處理,\(o(1)\)回答每次詢問,但不支援修改操作

首先,令\(f(i,j)\)表示區間\([i,i+2^j-1]\)的最值

顯然,\(f(i,0)\)表示區間\([i,i+2^0-1]\),也就是\(a_i\)的值

在其他維度中,\(f(i,j)\)表示區間\([i,i+2^j-1]\)的最值,相比起\(f(i,j-1)\)而言,所表示的區間範圍擴大了兩倍。最開始提到過,對乙個區間求最值的問題可以轉換為對兩個小區間分別求最值,既然是兩倍範圍,那麼就可以拆成兩個區間,這樣就可以通過上一維度的資訊求出當前維度的資訊。

即\(f(i,j)=max(f(i,j-1),f(i+2^,j-1))\)

那麼預處理的**不難寫出

void pre()

-1]\),也就是\(f(l,[x])\)

第二個區間向前移動了\(r-2^\),即\(f(r-2^+1,[x])\)

最多隻需要兩個區間,便能求出任意區間上的最值,因此查詢效率\(o(1)\)

**如下:

void read()

inline int read()

while (isdigit(ch))

return x*f;

}int main()

return 0;

}

ST表 學習筆記

概念 st表是用來求解區間最大值的一種優秀的離線演算法,它可以 o n logn o nlogn o nlog n 預處理,然後o 1 查詢,如何實現呢?思想運用了近似於區間dp的方法,乙個大區間有小區間轉移得到,不同的是,我們定義st i k st i k st i k 表示從第i ii個位置起,...

ST表的學習

st表的優勢在於可以把查詢乙個區間的最值的時間複雜度降為o n o n o n 假設有乙個陣列裡有10000個元素,第i個元素記為ar i 我們用f i j 表示從第i個元素開始,向右i 2j 1的 這些元素的最大值。有f i j max f i j 1 f i 2j 1 j 1 這其實是把區間 i...

ST表學習筆記

st表是一種利用dp思想求解最值的倍增演算法 st表常用於解決rmq問題,即求解區間最值問題 接下來以求最大值為例分步講解一下st表的建立過程 1.定義 f i j 表示 i,i 2j 1 這個長度為2j的區間中的最大值 2.預處理 f i 0 a i 即區間 i,i 的最大值就是a i 3.狀態轉...