根號演算法 分塊

2022-05-02 00:57:16 字數 1400 閱讀 4707

分塊演算法實質上是一種是通過分成多塊後在每塊上打標記以實現快速區間修改,區間查詢的一種演算法。其均攤時間複雜度為 $o(\sqrt n)$

分塊的基本思想是通過適當的劃分,預處理一部分資訊並儲存下來,用空間換取時間,達到時空平衡。事實上,分塊更接近於「樸素」,效率往往比不上樹狀陣列和線段樹,但是它更加通用、容易實現。

大部分常見的分塊思想都可以用「大段維護、區域性樸素」來形容。

我們經常講乙個長度為 n 的序列分為 $\sqrt n$ 個大小為 $\sqrt n$ 的塊,如果不是完全平方數,則序列最右端會多出乙個角塊。如圖,就是一種序列的分塊:

獲取乙個序號的所在塊可通過如下**:

int n;//

總個數int size=sqrt(n);//

每一塊大小

for(int i=1;i<=n;i++)

區間修改和區間查詢都是:對整段的修改/查詢標記,對於不是整段的採取樸素演算法,因為段樹和段長都是 $o(\sqrt n)$,所以單次操作的複雜度是 $o(\sqrt n)$,整個演算法的複雜度是 $o((n + q)* \sqrt nn)$.

分塊其實是一種樹形結構,它是一種只有三層的樹,形態如下:

莫隊演算法的思路是,離線情況下對所有的詢問進行乙個 sort() ,然後兩個指標 l,r(本題是兩個,其他的題可能會更多不斷以看似暴力的方式在區間內跳來跳去,最終輸出答案。 掌握乙個思想基礎:兩個詢問之間的狀態跳轉。

如圖,當前完成的詢問的區間為 [a,b]] ,下乙個詢問的區間為 [p,q] ,現在儲存 [a,b] 區間內的每個顏色出現次數的 sum 陣列已經準備好, [a,b] 區間詢問的答案 ans1 已經準備好,怎樣用這些條件求出 [p,q] 區間詢問的 ans2?

方法是:通過分塊加速,使得莫隊的時間複雜度均攤為 $o(n \sqrt n)$

帶修莫隊,是建立在莫隊基礎上的一種演算法。當原序列受到影響時,莫隊中儲存的答案必定會改變,那麼我們如何避免修改操作帶來的影響呢?

首先,我們需要將查詢操作和修改操作分別記錄下來。

在記錄查詢操作的時候,需要增加乙個變數來記錄離本次查詢最近的修改的位置,你需要乙個變數記錄現在已經做了幾次修改。如果改多了,你就要改回去,所以可以得到帶修改的莫隊分為三維,左指標,右指標,以及當前修改次數。和普通莫隊一樣,我們先對所有操作 sort 一遍後,每次再查詢。

**自:【洛谷**#20】**基礎根號演算法——分塊

筆記 根號演算法

張隊藥學根號演算法。也不知怎樣勾起了我的興趣。借鑑了 miracle 的思想 根號演算法是一種很常見的演算法 常見的根號思想有 雙向搜尋 根號分類討論 根號重建 複雜度平衡,以及一些根號級別的資料結構如分塊和莫隊 這些演算法一般是多種暴力演算法的結合,一般具有較低的思維難度和編碼難度 immorta...

查詢演算法 分塊演算法

查詢演算法 分塊演算法 查詢演算法主要有三種 線性查詢 二分查詢 分塊查詢 線性查詢效率最慢,可對無序列表進行查詢 二分查詢效率最快,只能針對有序列表進行查詢 分塊查詢的思路 分塊查詢中,每個塊中元素不一定有序的,塊間是有序的。分塊又稱索引順序查詢,這是順序查詢的一種改進方法,用於在分塊有序表中進行...

分塊演算法詳解

分塊演算法 1.思想 如果我們需要對乙個特定的序列進行操作,那麼非常直觀 簡單的方法就是純暴力 不,那叫模擬 不過如果暴力能過的話,那就呵呵了。所以我們要想一些比較高能的資料結構 分塊。相比線段樹來說,分塊演算法比較難實現,但是只要深入理解,就可以實現了,只不過需要一些資料結構的輔助。分塊實質來說就...