學習筆記:莫隊
阿新 • • 發佈:2021-08-19
無
【介紹】
- 莫隊\(\approx\)優化的暴力
【問題引入】
-
序列,多次查詢區間內不同的數的個數。
-
序列長度和查詢\(3 \times 10^4\)。
【解決】
方法1:暴力1
-
每次查詢開一個桶,掃一遍查詢區間,統計答案(若新增一個未出現過的數,則答案\(+1\))。
-
時間複雜度:\(O(nq)\)。
方法2:暴力2
-
考慮利用上一次查詢的結果。
-
在上一次查詢基礎上,通過移動左右端點,得到當前查詢的區間(刪除一個數後,若其出現次數變為\(0\),則答案\(-1\))。
-
時間複雜度:最差\(O(nq)\)。
方法3:莫隊
-
在暴力\(2\)的基礎上,通過調整查詢的順序,優化時間複雜度。
-
將序列等分成\(\sqrt n\)塊。
-
將查詢按左端點所在塊編號排序(第一關鍵字),若左端點在同一塊,則按右端點排序(第二關鍵字)。
-
當n,q同級時,時間複雜度:\(O(n \sqrt n)\)。
【莫隊時間複雜度證明】
左端點:兩次查詢間的移動次數\(O(\sqrt n)\),共\(q\)次查詢。所以總移動次數\(O(q \sqrt n )\)。
右端點:對於每塊內的查詢,移動次數\(O(n)\),共\(\sqrt n\)塊。所以總移動次數\(O(n \sqrt n)\)。