關於靜態 RMQ 問題

2022-01-11 17:33:47 字數 2322 閱讀 2217

目錄5. 乙個 - 的演算法

st 表:\(o(n\log n+q)\)

sqrt tree:\(o(n\log\log n+q)\)

線段樹 / zkw 線段樹:\(o(n + q\log n)\) .

貓樹:\(o(n\log n+q)\)

單調棧:\(o(q\log q+q\log n)\)

先分塊,假設塊長為 \(b\) .

預處理整塊的最小值,把每個整塊連起來然後開個 st 表,對每個零散塊也開 st 表

我們可以將詢問區間劃分為不超過 \(1\) 個整塊陣列上的連續塊區間和不超過 \(2\) 個原陣列上的整塊內的連續區間。顯然這些問題我們通過 st 表上的區間查詢解決。

取 \(b=\log n\),預處理複雜度就是 \(o(n\log\log n)\) 的,常數較大 .

乙個小優化:我們發現,在詢問的兩個端點屬於不同的塊的時候,塊內的詢問是關於每一塊字首或者字尾的詢問,用 \(o(n)\) 預處理答案,這樣子我們只需要在詢問的時候進行至多一次 st 表上的查詢操作了 .

題目:由乃救爺爺

分塊,設塊長為 \(b\),當然先預處理每個整塊的最小值

若區間跨過了多個塊,那麼整塊可以 st 表處理,零散塊可以預處理每個塊內的字首字尾最小值處理 .

若區間左右端點正好在同乙個塊內,暴力掃,複雜度 \(o(b)\) 比較高,但注意到詢問區間隨機的情況下,不難得出兩個端點在同乙個塊內的概率是 \(\dfrac bn\) .

所以這種情況期望複雜度 \(o\left(\dfracn\right)\) .

當 \(b\) 至少為 \(o(\log n)\) 時,預處理整塊 st 表複雜度 \(o\left(\dfrac nb\log\dfrac nb\right)\) 不超過 \(o(n)\) .

當 \(b\) 至多為 \(o(\sqrt n)\) 時,預處理整塊 st 表複雜度 \(o\left(q\dfrac bn\right)\) 不超過 \(o(q)\) .

所以 \(b\) 取 \(o(\log n)\) 到 \(o(\sqrt n)\) 之間的乙個值即可 .

當 \(b=\sqrt n\) 時,直接暴力預處理所有可能區間的最大值即可,複雜度不變,常數可能小一些 .

先 \(o(n)\) 建序列的笛卡爾樹,不難發現兩個點之間的最小值就是它們的 lca 的權值 .

使用基於 rmq 的樹上 lca 演算法,發現笛卡爾樹的尤拉序相鄰兩個節點深度差必然為 \(\pm 1\) .

我們假設我們在 word-ram model 中 .

由於相鄰兩個元素之差為 \(1\),那麼長度為 \(n\) 的本質不同的序列只有 \(2^n\) 個 .

考慮將序列按照 \(\dfrac12\log n\) 分段,在 word-ram model 中,乙個常見的假設是字長 \(w\ge \log n\),注意到長度為 \(\dfrac 12\log_2 n\) 的本質不同的數列只有 \(o(\sqrt n)\) 個,我們可以列舉所有可能的情況,並列舉左右端點,這可以在 \(o(\sqrt n\log^2 n)\) 的時間複雜度內完成 .

因為乙個數列長度為 \(n\) 的數列可以用二進位制串編碼(對於乙個序列 \(a\),其二進位制串編碼的第 \(j\) 位為 \([a_j)

對於分成的 \(o\left(\dfrac\right)\) 段,使用 st 表維護 .

從而對於零散塊來說,查表即可得出答案,我們也就得到了 \(o(n)\) - \(o(1)\) 的求解一般 rmq 問題的解法

好像可以把塊內用線段樹維護,整塊用 st 表,或許會更快 .

對於每個塊維護乙個單調佇列,再把單調佇列狀壓 .

這份提交 好像是這種寫法

離線並查集是 \(o(n\alpha(n))\) 的,本質相似,實際跑起來會快一些 .

同 \(2\),schieber vishkin algorithm 的描述可以在 這裡 找到

考慮左右端點在同一塊內的時候,把小塊當成乙個整序列,也是分塊,從而預處理時間 \(t(n)\) 滿足

\[t(n)=o(n)+\dfract(\log n)

\]不難發現,遞迴的深度是 \(o(\log^* n)\)

從而預處理時間複雜度 \(o(n\log ^* n)\),詢問時間複雜度 \(o(\log^* n)\)

我們不妨假設每層大塊長都是 \(2\) 的冪,這樣分出來的小段長都是一樣的:\(\log n,\log\log n,\cdots,1\)

對於乙個詢問,若其區間長度是 \(l\),我們找出第乙個小段長 \(\le l\) 的層,可以發現這個詢問一定可以在這一層或者上一層 \(o(1)\) 回答出來。這樣只要對每個詢問長度預處理找的層就可以做到 \(o(1)\) 詢問了 .

ST表 解決靜態RMQ問題

st表 解決靜態rmq問題 應用範圍比較窄,只能求解區間最值查詢,可以查最大值,也可以查最小值,一般在比賽中會和思維題放在一起考察 還有一種解決靜態rmq問題的是利用線段樹 時間複雜度 線段樹 o nlogn 預處理,單次詢問o logn 空間o n st表 o nlogn 預處理,單次詢問o 1 ...

談談RMQ問題

沒用的話 好像好久沒更博了,無聊就講講演算法吧 主要找不到水題 認識rmq 要學習rmq,首先要知道rmq問題是什麼吧?rmq簡單來說就是求區間的最大值 最小值 什麼?沒懂!舉個栗子 1 2 9 10 15 38 9 這裡有 7 個數 隨便輸的 rmq就是用來查詢這些數中的最大值 最小值 但是是區間...

ST表求解靜態RMQ 二維RMQ 模版

rmq range minimum query 範圍最小值問題。具體表現為一下一類問題 給出乙個 n 個元素的陣列 a1,a2,a na1,a2,an a1,a2,an 求解 min l,r min l,r min l,r 計算 min al,a l 1,ar minmi nal,al 1 arrm...