虚树学习小结

其实虚树这东西…不知道说什么好…简单易学呃
虚树主要处理一种询问总点数不超过O(n),且每次询问的那些点,在预处理之后,所求的值,只和他们,以及他们两两的LCA有关
这里有个显然的结论,即m个点两两的LCA不超过m-1个,将这m个点按dfs序排序之后相邻两点的m-1个LCA就是这m个点两两的LCA
建立虚树的过程,实际上是把那些在树上但是与询问无关的点剔除,只剩下会对答案产生贡献的点,接着挺多题就是在虚树上DP了,因为询问总点数不超过O(n),每次建立虚树用到的点不超过每次询问点数的2倍,所以除去排序,LCA的复杂度,虚树的时空复杂度都是O(n)的

具体实现的话,先把虚树要用到的点找出来,然后设个根(根出不出现在询问里都行)放在队头,接着按照dfs序插入队列,如果队尾不是当前点的祖先就pop掉队尾,否则队尾的点向当前点连边,判是否是祖先可以用括号序列。
细节方面的话,数组、边目录的清空要注意一下,然后虚树中有些点不是询问的点,所以要弄个数组记录这个点是不是当前询问的点

虚树的题…编码复杂度不高,细节好像也没什么,就是代码有点长(还是我自己的问题?)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值