我国市级网站建设分析模板,网上销售都有哪些平台,电子商务推广,wordpress在线咨询P3233 [HNOI2014]世界树
每次给出mi个点#xff0c;查询每个点控制的点的个数#xff0c;每个点由离他最近编号最小的点控制。
首先按照套路建出虚树#xff0c;注意特判1节点#xff0c;然后用栈维护右链#xff0c;然后不断弹栈建边。 然后进行dp#xff0c;求解出虚…P3233 [HNOI2014]世界树
每次给出mi个点查询每个点控制的点的个数每个点由离他最近编号最小的点控制。
首先按照套路建出虚树注意特判1节点然后用栈维护右链然后不断弹栈建边。 然后进行dp求解出虚树上每个点的最近控制点对于控制点就是自己需要两边dfs第一遍处理子树第二遍从上到下dp这样就处理出在整个树上的控制点。
然后对于其他点我们需要分类讨论
第一类就是直接连接到虚树节点上但是不包含虚树节点的子树这些点必然由g[u]控制具体计算size可以用siz[u]减去包含虚树节点的siz。
第二类就是在虚树节点之间的节点这一部分是一个链上挂了许多子树并且其中没有虚树节点这一部分要么由g[u]控制要么由g[v]控制。然后中间必然有一个分割点我们可以考虑倍增求解这个点的位置。 然后计算答案还需要知道v所对应子树是u的哪一个儿子这个也可以通过倍增求解然后就可以用这些点来计算对应这一部分的贡献了。 注意这里的虚树节点可能是lca节点所以对应贡献必须计算到g[u]和g[v]上。
代码细节
建立虚树的时候一定要小心每次弹栈都需要建边还有倍增寻找分割点的时候要注意两端点属于同一个控制点的情况虽然可以直接处理。