莫隊演算法講解(含樹上莫隊)
莫隊演算法
莫隊演算法是一種離線演算法,通常不能有修改 操作。
其通過對詢問操作的執行順序進行更改,然後使用最暴力的方法,可以達到很好的複雜度。
首先,如果要用莫隊演算法,則必須滿足已知ans[
l
,r
]可以得到ans[l
+1,r
],ans[l
-1,r
],ans[l
,r
+1],ans[l
,r
-1]。
莫隊演算法的實現步驟為:
1、先對原序列進行分塊。
2、離線操作,對詢問進行排序,以左端點所在塊編號 為第一關鍵字,右端點的位置為第二關鍵字,進行排序。然後維護[
l
,r
]的答案,並不斷調整l
和r
。
我們來分析一下時間複雜度:
1、左端點所在塊編號確定時,右端點位置單調不下降,所以右端點移動最多造成的時間複雜度是
O
(n
)的,總共\sqrt n
塊,總時間複雜度為O
(n\sqrt n
)。
2、左端點所在塊編號進行變動時,右端點移動最多造成的時間複雜度是
O
(n
),總共\sqrt n
塊,變動次數也就是\sqrt n
次,總時間複雜度為O
(n\sqrt n
)。
3、塊內左端點位置每次最多移動
\sqrt n
,一共m
次詢問,也就是一共移動m
次,總時間複雜度為O
(m\sqrt n
)。
總的來說,時間複雜度是
3 \over 2
次的,這是十分優秀的。
樹上莫隊
樹上莫隊是莫隊演算法的擴充,思想依然差不多,下面我介紹一種樹上莫隊的做法。
首先弄出樹的括號序。(對樹做一次深搜,第一次進入某節點時,將此節點編號加入序列,從某節點退出時,將此節點編號第二次加入序列)
如圖,有一棵樹,以及它的括號序:
然後記錄一個數在括號序中第一次出現和最後一次出現的位置。
如果要詢問
j
到k
之間路徑的資訊,需進行分類討論: (以下均遵循此原則,出現兩次的數字不算入所求資訊中)
1、如果
j
是k
的祖先,那麼所求資訊就為j
和k
最後出現的位置之間的資訊。 2、如果
j
不是k
的祖先。那麼所求資訊就為j
最先出現的位置以及k
最後出現的位置之間的資訊,我們發現,j
,k
的lca
不在其中,再把lca
加上即可。
那麼實現的時候就是用
cha
來表示一個點的出現情況的改變。 然後當做序列上的莫隊來做就可以了。
擴充:帶修改的莫隊
其實莫隊還是可以帶修改的。O(∩_∩)O~~
帶修改的莫隊其實也不難,我們三元組(l,r,x)來排序,x表示在此次詢問操作之前經過了x次修改操作。同樣的,知道(
l
,r
,x
)的答案可以知道(l
-1,r
,x
)(l
+1,r
,x
)(l
,r
-1,x
)(l
,r
+1,x
)(l
,r
,x
-1)(l
,r
,x
+1)的答案,一樣可以用莫隊演算法。
塊大小需要設定為
n^{2 \over 3}
,總時間複雜度是O
(n^{5 \over 3}
),證明略。 相關文章
- 莫隊演算法演算法
- 莫隊詳解
- 莫隊
- 【演算法學習】莫隊演算法
- 基礎莫隊演算法演算法
- 分塊 and 莫隊
- 神奇的莫隊
- 【2024-ZR-C Day 5】資料結構(3):莫隊(帶修莫隊、回滾莫隊)、邊分治、點分治、樹分治、動態點分治資料結構
- 根號分治莫隊
- 基礎莫隊模板
- 分塊與莫隊
- 莫隊演算法學習筆記演算法筆記
- 洛谷P1972(莫隊演算法)演算法
- 莫隊學習筆記筆記
- 搜尋選講、分塊初步、莫隊簡介
- 莫隊的 1.5 近似構造 題解
- HDU - 6291 對稱數 (樹上莫隊+分塊) (2018CCPC女生賽)
- C116 莫隊二次離線 P4887 莫隊二次離線
- 分塊莫隊學習筆記筆記
- 回滾莫隊學習筆記筆記
- cf375D. Tree and Queries(莫隊)
- bzoj3289: Mato的檔案管理(莫隊+樹狀陣列)陣列
- BZOJ4241: 歷史研究(回滾莫隊)
- C112 莫隊演算法 P1494 [國家集訓隊] 小 Z 的襪子演算法
- bzoj5301: [Cqoi2018]異或序列(莫隊)
- 洛谷P1494 [國家集訓隊]小Z的襪子(莫隊)
- 洛谷P4074糖果公園(帶修莫隊)
- 2024年3月19日 莫隊 + CF div3
- P5268-[SNOI2017]一個簡單的詢問【莫隊】
- 莫失己道, 莫擾ta心
- 24/11/30 ABC381+莫隊+分塊+整體二分學習筆記筆記
- 莫反小練
- 莫比烏斯
- 【莫煩】Python MatplotlibPython
- 莫比烏斯反演
- 【莫煩】Multiprocessing 多程式
- 莫比烏斯函式函式
- 莫的感情的一週
- 【莫煩】python基礎教程Python