虚树学习小结

来源:互联网 发布:科学网 博弈 复杂网络 编辑:程序博客网 时间:2024/06/05 11:59

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

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

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