樹上莫隊透過將樹轉化成DFS序(尤拉序)來解決問題。這道題目跟“HH的項鍊”很像,考慮樹上莫隊
首先對樹做出一個尤拉序,得到每個點在尤拉序中第一次出現的位置in[x]
和第二次出現的位置out[x]
;如果某個詢問的\((x,y)\)的in[x]
比in[y]
大,那麼交換\(x,y\),下面假設in[x]
比in[y]
小
如果\(x,y\)的\(\text{lca}\)是\(x\),那麼在尤拉序中從in[x]
到in[y]
中出現了一次的數就是樹上\(x,y\)路徑之中的數;否則的話,尤拉序中從out[x]
到in[y]
中出現了一次的數加上\(\text{lca(x,y)}\)就是樹上\(x,y\)路徑之間的數
統計的時候,記錄兩個陣列,cnt
和st
,前者表示每種顏色出現的次數(只記錄出現一次的數的顏色),後者表示一個數出現的次數(如果出現了兩次或者沒有出現,那麼他所代表的顏色不會計數),剩下的見打卡程式碼
OI-wiki上好像還有直接在樹上做莫隊的,有空了學一下