计树
题号:NC281512
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 1024 M,其他语言2048 M
64bit IO Format: %lld

题目描述

\hspace{15pt}给定由 n 个结点构成、以 1 号节点为根节点的有根树,选中其中 k 个节点,记为集合 \Bbb V
\hspace{15pt}现在,你需要构建一个计数数组 {\rm cnt},其中 {\rm cnt}_i 表示节点 i 作为 LCA 的次数。
\hspace{15pt}具体操作如下:
\hspace{23pt}\bullet\,从集合 \Bbb V 中选择一个节点 u
\hspace{23pt}\bullet\,从集合 \Bbb V 中选择一个节点 v(可能会与 u 相同);
\hspace{23pt}\bullet\,u,v 两个节点的最近公共祖先(LCA)为 i,更新 {\rm cnt}_i{\rm cnt}_i + 1
\hspace{15pt}对于全部 k^2 个选取方式,重复上述操作。最后输出 {\rm cnt} 数组。

输入描述:

\hspace{15pt}第一行输入一个整数 n \left(1 \leqq n \leqq 10^5\right) 代表树的节点数。
\hspace{15pt}此后 n-1 行,第 i 行输入两个整数 u_i,v_i \left(1 \leqq u_i,v_i \leqq n;\ u_i \neq v_i\right) 代表树上第 i 条边连接节点 u_iv_i
\hspace{15pt}n+1 行输入一个整数 k \left(1 \leqq k \leqq n\right) 代表集合 \Bbb V 的大小。
\hspace{15pt}n+2 行输入 k 个整数 a_1,a_2,\dots,a_k \left(1 \leqq a_i \leqq n\right) 代表集合 \Bbb V 中的节点。

输出描述:

\hspace{15pt}在一行上输出 n 个整数,其中第 i 个整数表示节点 i 作为 LCA 的次数,即 {\rm cnt}_i 的值。
示例1

输入

复制
5
1 2
1 3
2 4
2 5
3
2 3 4

输出

复制
4 3 1 1 0

说明

\hspace{15pt}在这个样例中,树的形态如下图所示。