「题解」洛谷 P6773 [NOI2020] 命运(线段树合并优化 DP)
记一个 条件 为 \((u,v)∈\mathcal{Q}\)。
一个重要观察:对于以 \(u\) 为底的所有条件,若深度深的能满足,深度更浅也能满足。
DP,设 \(f_{u,i}\) 表示对 \(u\) 的子树内的边染色(其余边为 \(0\)),对于所有底在 \(u\) 子树内的条件,不能被满足的深度最深的询问,深度为 \(i\) 的方案数。
记 \(d_u\) 为 \(u\) 的深度,考虑 \(u\) 的一个子节点 \(v\):
\[f'_{u,i}=\sum_{j=0}^{d_u}{f_{v,j}f_{u,i}}+(\sum_{j=0}^{i}f_{v,j}f_{u,i}+\sum_{j=0}^{i-1}f_{v,i}f_{u,j})
\]
记 \(s_{u,i}=\sum_{j<i}f_{u,j}\),
\[f'_{u,i}=f_{u,i}(s_{v,d_u}+s_{v,i})+f_{v,i}s_{u,i-1}
\]
线段树合并即可。
具体的,由于只需要乘法标记,因而一个不存在的点,其 \(f\) 值一定为 \(0\)。
代码时注意,可并线段树中 \(u\) 的左右儿子不是 u << 1, u << 1 | 1
!