CF1118F2 Tree Cutting (Hard Version)

题意

给定一个有 nn 个节点的树,节点可能有颜色,共 kk 种颜色,编号 1...k1...k,保证每种颜色都出现. 有的点没有颜色,用 00 表示. 将其划分为 kk 个联通块,是每个联通块中有且仅有一种颜色,颜色为 00 的节点可以在任意联通块中. 求有多少中划分的方案

2kn3×1052\le k\le n\le 3\times 10^5,答案对 998244353998244353 取模

题解

显然有一些点的染色是确定的,一些点可以染上多种颜色,其中所有颜色为 cc 的点与它们的LCA的路径上的点确定染上颜色 cc
先将这些颜色确定的点染色

接下来考虑树形DP
fu,0f_{u,0} 表示在以 uu 为根的子树中,最上方联通块不包含已染色点的方案数,fu,1f_{u,1} 表示在以 uu 为根的子树中,最上方联通块包含已染色点的方案数,cuc_u 表示点 uu 的颜色

分两种情况讨论转移:

  • cu0c_u\not=0 显然 fu,0=0f_{u, 0}=0
    对于 fu,1f_{u, 1},再分情况讨论:

    • vsonu,cv0v\in\text{son}_u,c_v\not=0
      能够确定边 (u,v)(u, v) 是否删去,对 fu,1f_{u, 1} 贡献为 fv,1=fv,0+fv,1f_{v, 1}=f_{v, 0}+f_{v, 1}
    • vsonu,cv=0v\in\text{son}_u,c_v=0
      若边 (u,v)(u, v) 删去,vv 所在联通块必须有色,对 fu,1f_{u, 1} 贡献为 fv,1f_{v, 1}
      若边 (u,v)(u, v) 保留,vv 所在联通块必须无色,对 fu,1f_{u, 1} 贡献为 fv,0f_{v, 0}
      总贡献为 fv,0+fv,1f_{v, 0}+f_{v, 1} 综上,fu,1=vsonufv,0+fv,1f_{u, 1}=\prod\limits_{v\in\text{son}_u}f_{v, 0}+f_{v, 1}
  • cu=0c_u=0
    类似的,fu,0=vsonufv,0+fv,1f_{u, 0}=\prod\limits_{v\in\text{son}_u}f_{v, 0}+f_{v, 1}
    对于 fu,1f_{u, 1},枚举 uu 继承哪一个儿子节点的颜色,即 fu,1=v1sonufv1,1×v2sonu,v2v1fv2,0+fv2,1f_{u, 1}=\sum\limits_{v_1\in\text{son}_u}f_{v_1, 1}\times\prod\limits_{v_2\in\text{son}_u,v_2\not=v_1}f_{v_2, 0}+f_{v_2, 1}
    对这条式子维护 fv,0+fv,1f_{v, 0}+f_{v, 1} 的前缀积和后缀积即可

总的时间复杂度 Θ(n)\Theta(n)Θ(nlogn)\Theta(n\log n),取决于求LCA的算法

代码 codeforces submission 143330738

CF1118F2 Tree Cutting (Hard Version)

https://gzezfisher.top/cf1118f2/

作者

Fisher Cai

发布于

2022-01-27

更新于

2025-07-22

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×