樹上計數2

最爱丁珰發表於2024-08-17

樹上莫隊透過將樹轉化成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\)路徑之間的數

統計的時候,記錄兩個陣列,cntst,前者表示每種顏色出現的次數(只記錄出現一次的數的顏色),後者表示一個數出現的次數(如果出現了兩次或者沒有出現,那麼他所代表的顏色不會計數),剩下的見打卡程式碼

OI-wiki上好像還有直接在樹上做莫隊的,有空了學一下

相關文章