AT_dwango2016final_d 木
题目描述
给定一个由 $ N $ 个顶点组成的带权无向树。顶点从 $ 1 $ 到 $ N $ 编号。
初始时,所有边的权重均为 $ 1 $。定义顶点 $ u,v $ 之间的距离 $ dist(u,v) $ 为连接 $ u $ 和 $ v $ 的最短路径上边的权重之和。
此外,对于顶点 $ u,v $,定义:
$ f(u,v)=\max\{dist(u2,v2)|dist(u,v2)=dist(u,v)+dist(v,v2)\ 且\ dist(v,u2)=dist(v,u)+dist(u,u2)\} $
即, $f(u,v)$ 表示将顶点 $u$ 和 $v$ 朝着彼此远离的方向移动时的最大距离。
定义“整棵树的代价”为:
$$\sum_{}^{} {f(u,v)}\\ ({u \in \{1,...n\}\ ,v \in \{1,...n\}\ , u < v})$$
请编写一个程序,计算将每条边的权重设置为$ 2 $后,整棵树的代价增加了多少。
输入格式
从标准输入中按以下格式读取输入:
> $ N $ $ p_1 $ $ p_2 $ ... $ p_{N-1} $
- 第 $1$ 行包含一个整数 $N(2 \le N \le 252525)$,表示树的顶点数。
- 第 $2$ 行包含 $N-1$ 个整数,以空格分隔,第$ i(1\le i\le N-1) $个整数表示连接顶点 $p_i(1\le p_i\le i)$ 和顶点 $i+1$ 的树边。
输出格式
输出 $N-1$ 个整数,以空格分隔,表示将边 $(p_i,i+1)$ 的权重设置为 $2$ 后,整棵树的代价增加了多少。
确保输出末尾没有多余的空格,并在最后记得输出换行。
## 样例
### 输入
```
5
1 1 2 2
```
### 输出
```
9 9 7 7
```
### 样例解释
设置边 $(1,2), (1,3)$ 的权重为 $2$ 后,整棵树的代价增加 $9$。设置边 $(2,4)$ 的权重为 $2$ 后,整棵树的代价增加 $7$。
(题目中的示例解释已经包含在了原文中,这里不再重复翻译。)
说明/提示
### 部分点
この問題には部分点が設定されている。
- $ N\ ≦\ 300 $ を満たすデータセットに正解した場合、部分点として $ 30 $ 点が与えられる。
- $ N\ ≦\ 3000 $ を満たすデータセットに正解した場合、部分点として追加で $ 50 $ 点が与えられる。合計で$ 80 $点となる。
- 追加の制約のないデータセットに正解した場合、部分点として追加で $ 160 $ 点が与えられる。合計で$ 240 $点となる。
### Sample Explanation 1
辺$ (1,2),\ (1,3) $の重みを$ 2 $としたとき、 $ 1≦\ u\