大意: 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分类讨论求出.