树上计数2

树上莫队通过将树转化成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上好像还有直接在树上做莫队的,有空了学一下

posted @ 2024-08-17 07:59  最爱丁珰  阅读(20)  评论(0)    收藏  举报