树上莫队通过将树转化成DFS序(欧拉序)来解决问题
首先对树做出一个欧拉序,得到每个点在欧拉序中第一次出现的位置in[x]
和第二次出现的位置out[x]
;如果某个询问的
(
x
,
y
)
(x,y)
(x,y)的in[x]
比in[y]
大,那么交换
x
,
y
x,y
x,y,下面假设in[x]
比in[y]
小
如果
x
,
y
x,y
x,y的
lca
\text{lca}
lca是
x
x
x,那么在欧拉序中从in[x]
到in[y]
中出现了一次的数就是树上
x
,
y
x,y
x,y路径之中的数;否则的话,欧拉序中从out[x]
到in[y]
中出现了一次的数加上
lca(x,y)
\text{lca(x,y)}
lca(x,y)就是树上
x
,
y
x,y
x,y路径之间的数
统计的时候,记录两个数组,cnt
和st
,前者表示每种颜色出现的次数(只记录出现一次的数的颜色),后者表示一个数出现的次数(如果出现了两次或者没有出现,那么他所代表的颜色不会计数),剩下的见打卡代码
OI-wiki上好像还有直接在树上做莫队的,有空了学一下