Jamie and Tree CodeForces - 916E (树剖,换根)

大意: n节点树, 每个点有权值, 三种操作: 1,换根. 2, lca(u,v)的子树权值全部增加x. 3, 查询子树权值和.

换根板子题, 这里总结一下换根思路, 因为我们不可能每次换根都暴力dfs, 所以只能还在原树上考虑, 这就需要将贡献转化一下. 这里假设初始根为1, 换根后为$r$.

1, 子树$x$所有节点加.

(1)若x不在树链1->r上, 直接加即可

(2)若x=r, 对全部节点加

(3)若x在树链1->r上且x!=r, 全部节点加, 再对x在x->r方向上的儿子所在子树减

判断是否在树链1->r以及求出x->r方向的儿子都可以用树剖O(logn)很容易求出

2, 查询lca(x,y), 假设原树上lca为L

(1)若树链x->L->y与1->r无公共路径, 则为L

(2)若有公共路径(s,t), 则为s,t中深度大的点

求公共路径可以对lca分类讨论求出.

猜你喜欢

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