题号:NC201834
时间限制:C/C++/Rust/Pascal 3秒,其他语言6秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld
题目描述
在一棵有根树 T 上,任何两点间的最短路径都能够分为两个阶段:
- 从起点出发,沿着向根的方向走若干条边。
- 向着终点,沿着离开根的方向走若干条边。
定义一条路径的权值为向上走的边数乘上向下走的边数。特殊地,当起点等于终点的时候,两阶段的边数都是 0;当起点是终点的祖先的时候,第一阶段的边数是 0;当终点是起点的祖先的时候,第二阶段的边数是 0 ------这三种情况下,路径的权值都是 0。
现在给出一棵 n 个节点的无根树 T 和 m 条路径
)
。对于每一个

,你需要计算当 r是根节点的时候,所有路径的权值和是多少。
输入描述:
第一行输入两个整数
。
接下来 n-1 行每行输入两个整数
,表示树上的一条边。
接下来 m 行每行输入两个整数
,表示一条路径。
输出描述:
输出 n 行每行一个整数,第 i 行表示以 i 为根时,所有路径的权值和。
示例1
输入
复制
5 2
1 2
1 3
3 4
3 5
2 5
4 5