數列分塊入門

數列分塊入門 1~9


數列分塊入門 1

區間加法,單點查詢

完整的塊更新標記,不完整的塊暴力更新 $ O(q\sqrt{n} ) $


數列分塊入門 2

區間加法,查詢區間內比 x 小的數的個數

每個塊內排序一下,查詢二分一下 $ O(q\sqrt{n}\mathrm{log}n) $


數列分塊入門 3

區間加法,查詢區間內 x 的前驅

每個塊內維護一下,查詢二分一下 O(qnlogn)O(q\sqrt{n}\mathrm{log}n)

也可以用 set


數列分塊入門 4

區間加法,區間求和

維護一下塊的和 O(qn)O(q\sqrt{n})


數列分塊入門 5

區間開方區間求和

我們發現開根多次後每個數都會變成 1,變成 1 之前暴力修改就可以 $O(kn + q\sqrt{n}) $


數列分塊入門 6

單點插入 單點詢問

我們把初始的數列拆成長度爲 n\sqrt{n} 的塊,維護每塊的長度

每次插入時在塊內暴力插入,如果一個塊的長度超過了 2n2\sqrt{n} 那麼我們將它拆成兩塊 O(qn)O(q\sqrt{n})


數列分塊入門 7

區間乘法 區間加法 單點詢問

像線段樹一樣維護標記就可以了 O(qn)O(q\sqrt{n})


數列分塊入門 8

每次區間詢問等於 x 的數的個數,並將這個區間的所有數改爲 x

如果一個塊內的數都不同的話,就暴力的查詢塊,這樣每次詢問最多打亂兩個塊 O(qn)O(q\sqrt{n})


數列分塊入門 9

詢問區間最小衆數

一段區間的衆數可能是 所有完整塊內數的衆數 或者 不完整塊中的數

那我們可以對每對 i, j 預處理出第 i 塊到第 j 塊的衆數

這樣每次詢問我們只需要查詢 n\sqrt{n} 級別的數在區間內出現的次數就可以了

我們可以離散化後用 vector 存下每個數出現的位置,然後二分就可以了 $ O( n\sqrt{n} + q\sqrt{n}\mathrm{log}n) $

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章