题目链接:
- link,点击这里喵。
题意简述:
- 给出一棵树,取一点 i i i,并另取两点 u u u 和 v v v,在 u u u 和 v v v 简单路径上任取一点使这点与 i i i 的距离最小,计算出这样所有的组合的距离的总和。
思路:
- 看眼数据范围,总点数 n ≤ 2 × 1 0 5 n\le2\times10^5 n≤2×105,考虑线性算法,有关于树,首先考虑树上 dp。
- 这道题题面很具有迷惑性,她把 ∑ u = 1 n ∑ v = u + 1 n ∑ i = 1 n f ( u , v , i ) \sum\limits_{u = 1}^n \sum\limits_{v = u + 1}^n \sum\limits_{i = 1}^n f(u, v, i) u=1∑nv=u+1∑ni=1∑nf(u,v,i) 中的 $\sum\limits_{i = 1}^n $ 放在了后面,这就导致如果思路想到枚举 u u u 和 v v v,就很难 dp 了,根据 ∑ \sum ∑ 的性质,我们把 $\sum\limits_{i = 1}^n $ 提到外面去,原式就变成了 ∑ i = 1 n ∑ u = 1 n ∑ v = u + 1 n f ( u , v , i ) \sum\limits_{i = 1}^n \sum\limits_{u = 1}^n \sum\limits_{v = u + 1}^n f(u, v, i) i=1∑nu=1∑nv=u+1∑nf(u,v,i),思路就简洁明了了,记录每个点的答案,最后相加即可。
- 那么 O ( n ) O(n) O(n) 做法考虑换根 dp,这里假设以点 1 1 1 为出发点。
做法:
-
定义 l j i lj_i lji 为点 i i i 及其子树所包含的点对数量, s i z i siz_i sizi 为点 i i i 及其子树的大小, s i z i siz_i sizi 为以点 i i i 为 ∑ u = 1 n ∑ v = u + 1 n f ( u , v , i ) \sum\limits_{u = 1}^n \sum\limits_{v = u + 1}^n f(u, v, i) u=1∑nv=u+1∑nf(u,v,i) 的答案。
dfs1:
- s i z n o w = ∑ t o s i z t o siz_{now}=\sum\limits_{to} siz_{to} siznow=