树上计数2

树上莫队通过将树转化成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路径之间的数

统计的时候,记录两个数组,cntst,前者表示每种颜色出现的次数(只记录出现一次的数的颜色),后者表示一个数出现的次数(如果出现了两次或者没有出现,那么他所代表的颜色不会计数),剩下的见打卡代码

OI-wiki上好像还有直接在树上做莫队的,有空了学一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值