题意
给定一个有
n
个节点的树,节点可能有颜色,共
k
种颜色,编号
1...k,保证每种颜色都出现.
有的点没有颜色,用
0
表示. 将其划分为
k
个联通块,是每个联通块中有且仅有一种颜色,颜色为
0
的节点可以在任意联通块中. 求有多少中划分的方案
2≤k≤n≤3×105,答案对
998244353
取模
题解
显然有一些点的染色是确定的,一些点可以染上多种颜色,其中所有颜色为
c
的点与它们的LCA的路径上的点确定染上颜色
c
先将这些颜色确定的点染色
接下来考虑树形DP
令
fu,0
表示在以
u
为根的子树中,最上方联通块不包含已染色点的方案数,fu,1
表示在以
u
为根的子树中,最上方联通块包含已染色点的方案数,cu
表示点
u
的颜色
分两种情况讨论转移:
cu=0
显然
fu,0=0
对于
fu,1,再分情况讨论:
- v∈sonu,cv=0
能够确定边
(u,v)
是否删去,对
fu,1
贡献为
fv,1=fv,0+fv,1
- v∈sonu,cv=0
若边
(u,v)
删去,v
所在联通块必须有色,对
fu,1
贡献为
fv,1
若边
(u,v)
保留,v
所在联通块必须无色,对
fu,1
贡献为
fv,0
总贡献为
fv,0+fv,1
综上,fu,1=v∈sonu∏fv,0+fv,1
cu=0
类似的,fu,0=v∈sonu∏fv,0+fv,1
对于
fu,1,枚举
u
继承哪一个儿子节点的颜色,即
fu,1=v1∈sonu∑fv1,1×v2∈sonu,v2=v1∏fv2,0+fv2,1
对这条式子维护
fv,0+fv,1
的前缀积和后缀积即可
总的时间复杂度
Θ(n)
到
Θ(nlogn),取决于求LCA的算法
代码 codeforces
submission 143330738