1. 程式人生 > 其它 >學習筆記:莫隊

學習筆記:莫隊

【介紹】

  • 莫隊\(\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)\)