小
x
x
x与树 题解
题目大意:
有一棵树,每个结点上有一个颜色。现在要求以 b b b为根的子树中有多少种颜色。
子任务 1 1 1:
子任务 1 1 1的树是一条链,我们可以直接递归和桶来过这道题。
子任务 2 2 2:
子任务
2
2
2是
n
=
m
n=m
n=m且所有结点的颜色不同。其实可以转化为:求以
b
b
b为根的子树中有多少个结点。
这个就是一个树型动规的问题,我们假设
f
i
f_i
fi表示以
i
i
i为根的子树中有多少个结点。
则
f
i
=
∑
j
∈
s
o
n
i
f
j
+
1
f_i=\sum_{j\in son_i}{f_j}+1
fi=∑j∈sonifj+1。
上面的式子表示以
i
i
i结点为根的子树的结点个数等于它的所有儿子结点的个数的和再加
1
1
1(它本身)。
子任务 3 3 3:
可以暴力来做,时间复杂度为 O ( n q ) O(nq) O(nq)。
子任务 4 4 4:
也是用树型动规。设
f
i
,
j
f_{i,j}
fi,j表示以
i
i
i为根的子树中有颜色
j
j
j的结点个数。则
f
i
,
j
=
∑
k
∈
s
o
n
i
f
k
,
j
(
j
≠
a
i
)
f_{i,j}=\sum_{k\in son_i}{f_{k,j}}(j\not=a_i)
fi,j=∑k∈sonifk,j(j=ai)
f
i
,
a
i
=
∑
j
∈
s
o
n
i
f
j
,
a
i
+
1
f_{i,a_i}=\sum_{j\in son_i}{f_{j,a_i}}+1
fi,ai=∑j∈sonifj,ai+1
上面的式子表示以
i
i
i为结点的子树中有
j
j
j颜色的个数等于它的儿子有颜色
j
j
j的个数的和。如果
j
=
a
i
j=a_i
j=ai,那么就还要加上
1
1
1。
那么我们就可以用
O
(
n
m
)
O(nm)
O(nm)的时间卡过这题。