咕咕咕咕

题目描述

lrb有一棵树,树的每个节点有个颜色。给一个长度为n的颜色序列,定义s(i,j) 为i 到j 的颜色数量。以及

\(sum_i = sum_{j=1}^{n} s(i,j)\)

现在他想让你求出所有的sum[i]

输入输出格式

输入格式:

第一行为一个整数n,表示树节点的数量

第二行为n个整数,分别表示n个节点的颜色c[1],c[2]……c[n]

接下来n-1行,每行为两个整数x,y,表示x和y之间有一条边

输出格式:

输出n行,第i行为sum[i]

输入输出样例

输入样例#1:


5
1 2 3 2 3
1 2
2 3
2 4
1 5

输出样例#1:


10
9
11
9
12

说明

plain
sum[1]=s(1,1)+s(1,2)+s(1,3)+s(1,4)+s(1,5)=1+2+3+2+2=10
sum[2]=s(2,1)+s(2,2)+s(2,3)+s(2,4)+s(2,5)=2+1+2+1+3=9
sum[3]=s(3,1)+s(3,2)+s(3,3)+s(3,4)+s(3,5)=3+2+1+2+3=11
sum[4]=s(4,1)+s(4,2)+s(4,3)+s(4,4)+s(4,5)=2+1+2+1+3=9
sum[5]=s(5,1)+s(5,2)+s(5,3)+s(5,4)+s(5,5)=2+3+3+3+1=12

对于40%的数据,n<=2000

对于100%的数据,1<=n,c[i]<=10^5

– – – – – –

一眼看题解题qaq

考虑当前分治中心为u,对于其子树中的一个点x,如果它的颜色是第一次出现的,

那么它对分治中心的贡献为它的sz[x],我们记录下这个颜色的贡献col[dat[x]],

dfs完后res[u]+=sum。

考虑每棵子树之间的贡献,对于子树中的某一个节点x,res[x]就是其他子树对根造成的贡献加上其他子树大小乘上新颜色的贡献,因为他们中的每个点形成的路径都能对x造成贡献。

res[x]+=sum+num*vcur;

还有一些细节…

`

分类: 题解

说点什么

avatar
  Subscribe  
提醒