Arkady and a Nobody-men CodeForces - 860E (树)

大意: 给定有根树, 根节点深度为$1$.

定义$r(a,b)$为$b$子树内深度不超过$a$的节点数$-1$

定义$z_a$为$a$的所有祖先的$r$之和. 对于所有点求出$z$的值.

一个点$y$对$x$的贡献显然为$dep[lca(x,y)]$, 直接计算是$O(n^2logn)$, 考虑优化.

注意到点$y$对$x$子树内所有点贡献都相同, 我们考虑深度相同的点之间的贡献, 就转化为对下面程序的优化.

REP(d,1,n) q[dep[i]].push_back(i);
REP(d,1,n) {
	for (int x:q[d]) for (int y:q[d]) {
		ans[x]+=dep[lca(x,y)];
	}
}

 显然建出虚树优化即可, 复杂度是$O(nlogn)$.

猜你喜欢

转载自www.cnblogs.com/uid001/p/10851376.html
今日推荐