樹上莫隊的核心思想,就是將一棵樹轉化成乙個序列,然後用普通莫隊來搞。
以一棵樹為例:
要想對這棵樹進行樹上莫隊,我們第一步就是用乙個\(s\)陣列把它的括號序存下來:
\(id\)12
3456
78910
1112
1314
1516
\(s\)12
4788
7455
2366
31同時,我們用\(i\)陣列儲存每個數字在括號序列中第一次出現的位置,用\(o\)陣列儲存每個數字在括號序列中第二次出現的位置。
首先,對於詢問的兩個數\(x,y\),我們要保證\(i_x\le i_y\)(這可以通過\(swap\)進行保證)。
對於查詢的兩個節點,我們需要對其進行分類討論。
我們需要分別找到\(x,y\)在括號序列中第一次出現的位置(即\(1\)和\(9\))。
然後就能得到一段區間:
\[1,2,4,7,8,8,7,4,5
\]對於出現兩次的元素,我們將它去掉(在程式中只要判斷乙個元素出現次數的奇偶性即可)。
然後就得到這樣乙個區間:
\[1,2,5
\]而這些恰好就是我們要求解的元素。
簡單說,就是求解區間\([i_x,i_y]\)即可。
我們需要找出\(x\)在括號序列中第二次出現的位置和\(y\)在括號序列中第一次出現的位置(即\(10\)和\(13\))。
然後就能得到這樣乙個區間:
\[5,2,3,6
\]注意,對於出現兩次的元素,我們同樣需要將它去掉,只不過這個例子中剛好沒有出現這樣的情況而已。
然後我們可以發現,這個區間中的元素就是除\(lca_\)以外要求解的全部元素。
則我們單獨計算\(lca_\)的貢獻,儲存答案後再將其貢獻減去即可。
好好想一下,就可以發現樹上莫隊其實挺好理解的。
下面是一道例題:【bzoj3757】蘋果樹。
莫隊演算法學習筆記(一) 普通莫隊
前言 在學習莫隊演算法之前,我一直以為這是乙個很高深的演算法。實際上,它就是乙個很高深的演算法 這個演算法玄學地將分塊與暴力兩大演算法實現了二合一,從而打造出了乙個時間複雜度為o n n o n sqrt n o nn 的求解多個區間詢問的離線演算法。具體介紹 首先,我們以詢問中l ll所在的區間為...
學習筆記 樹上莫隊
其實樹上莫隊是乙個尤拉序而已嘛,像普通的莫隊,特判一下出現過兩次的值就行了 設 st i 為 i 進棧的時間,ed i 為 i 出棧的時間,dfn x,那麼就可以分兩種情況 1 y 在 x 子樹中,也就是 lca x,y x 那麼區間轉化成 st x,st y 2 y 不在 x 子樹中,也就是 lc...
學習筆記 樹上莫隊
王室聯邦 樹分塊,參見popoqqq大神的部落格,講得很詳細 莫隊 小z的襪子 樹上莫隊 把前面兩個東西結合在一起,不要管什麼xor,就是寫乙個solve,走過的路徑賦成走過,因為lca沒走過,所以沒計算過,加進去,計算後再減去,因為lca最終是不需要的 蘋果樹 不知道對不對 include inc...