链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2286
题意:中文题。
分析:题目中要求所有的关键点与根1断开,很容易想到树形dp。但是由于多组询问会导致时间*m。单次O(n)不可取。很显然是要优化的,我们发现单次O(n)时还是会做很多无用功,而且题目说sigma(ki)<=5*10^5,意思是所有查询的点最多才涉及5*10^5个点。于是有了一种虚树的方法:我们构造一棵包含当前询问中所有关键点的树。构造方法:先按dfs序将所有关键点排序,先处理掉包含关系的点(有包含关系那么显然只要断开与根最近点的就够了),再用一个栈维护一条原树上的链,当加入新点的时候我们判断栈顶节点d[top]和新节点h[i]的lca在这条链中的位置,因为lca包含d[top]而且维护的是一条链,那么lca必定是d[top]到根路径上的点(不一定在栈内),我们在踢出栈顶元素的时候只要给栈顶元素与lca之间加一条边即可(因为可能存在情况是a,b两点断开的位置都是在lca(a,b)到根上的点,如果不加入lca这个点那么断点花费就会花双倍)。这样处理完之后新树的节点最多为2*K。然后树上dp即可。O(k*logn)
代码:
#include
推荐阅读