题解【LOJ3340】「NOI2020」命运

题面

一个性质:

对于一个点对 \((u,v)\),其中 \(u\)\(v\) 的祖先,如果 \((u,v)\) 满足题目中的限制条件,那么对于每一个 \(u\) 的祖先 \(w\),点对 \((w,v)\) 一定也满足限制条件。

根据这个性质,我们可以进行 DP:设 \(f_{u,i}\) 表示下端点在 \(u\) 的子树中、不满足限制条件的上端点最大的深度为 \(i\) 的方案数,其中 \(f_{u,0}\) 表示所有限制条件都被满足。

转移考虑 \(u\) 的子节点 \(v\),边 \((u,v)\) 填的是 \(0/1\)

  1. \(1\)\(f_{u,i}=\sum\limits_{j=0}^{dep_u}f_{u,i}f_{v,j}\)
  2. \(0\):假设 \(f_{u,i}\)\(f_{v,j}\) 转移过来,那么一定有 \(i\ge j\)(证明可以通过开头的性质),所以 \(f_{u,i}=\sum\limits_{j=0}^i f_{u,i}f_{v,j}+\sum\limits_{j=0}^{i-1}f_{u,j}f_{v,i}\),其中后面一项上界是 \(i-1\) 的原因是避免 \(f_{u,i}f_{v,i}\) 算两次。

考虑进一步优化。设 \(g_{u,i}=\sum\limits_{j=0}^i f_{u,j}\),整理一下转移式子:

\[\begin{aligned} f_{u,i} &=f_{u,i}g_{v,dep_u}+f_{u,i}g_{v,i}+f_{v,i}g_{u,i-1}\\ &=f_{u,i}(g_{v,dep_u}+g_{v,i})+f_{v,i}g_{u,i-1} \end{aligned} \]

然后考虑整体 DP,用线段树维护 DP 值。发现 \(g_{v,dep_u}\) 与下标无关,可以直接先算出来。维护 \(g_{v,i}\)\(g_{u,i-1}\) 即可,区间乘法可以打标记维护。

具体实现细节参考 代码

posted @ 2021-03-25 19:38  csxsi  阅读(43)  评论(0编辑  收藏  举报