Loading

P6773 [NOI2020] 命运

题目

给定结点个数为 \(n\) 的一棵树和 \(m\)祖先关系点对,每条边可染成黑白的,每个给定点对之间路径至少存在一条边为黑色,求合法染色方案数。

分析

对于至少容易想到容斥,这里采用经典的集合的交等价于全集减去集合补的并,因此答案转化为:

\[\sum_{S}(-1)^{|S|}2^{n-1-|\bigcap_{p\in S} p|} \]

直接枚举显然超时,此处容斥的容斥系数仅为 \((-1)^{|S|}\),可以在动态规划转移过程中解决,且路径并的贡献是可拆分的,因此考虑动态规划。
\(f_{u,i}\)\(u\) 子树内,所取的点对最高顶点的深度为 \(j\) 的容斥数量。
转移有:

  1. 合并当前结点 \(u\) 与儿子 \(v\)

\[f_{u,\min(i,j)}\leftarrow f_{u,i}\times f_{v,j} \]

  1. 添加一条点对,记 \(D\) 为顶点深度。

\[f_{u,i}\leftarrow -\sum_{\min(j,D)=i} f_{u,j} \]

观察该式,发现本质上是三个转移式,即:

\[\begin{equation} \begin{cases} f_{u,i}=0,(i<D) \\ f_{u,i}=-\sum_{j=i+1}^n f_{u,j},(i=D) \\ f_{u,i}=f_{u,i},(i>D) \end{cases} \end{equation}\]

优化考虑线段树合并(因为第二维是由点对增加的,且信息可快速合并)。
第二种转移是容易的,只需区间赋值,区间求和即可,考虑第一种转移,将转移式更具体写出即为:

\[f_{u,i}\leftarrow f_{u,i}\times \sum_{j=i+1}^n f_{v,j}+f_{v,i}\times \sum_{j=i+1}^n f_{u,i} \]

这个式子和PKUSC2018 MINMAX一样的,当存在单个结点时直接区间乘即可。
总复杂度 \(O((n+m)\log n)\)

代码


posted @ 2025-01-25 19:59  mmilesask  阅读(13)  评论(0)    收藏  举报