记一个 条件 为 ( u , v ) ∈ Q (u,v)∈\mathcal{Q} (u,v)∈Q。
一个重要观察:对于以 u u u 为底的所有条件,若深度深的能满足,深度更浅也能满足。
DP,设 f u , i f_{u,i} fu,i 表示对 u u u 的子树内的边染色(其余边为 0 0 0),对于所有底在 u u u 子树内的条件,不能被满足的深度最深的询问,深度为 i i i 的方案数。
记 d u d_u du 为 u u u 的深度,考虑 u u u 的一个子节点 v v v:
f u , i ′ = ∑ j = 0 d u f v , j f u , i + ( ∑ j = 0 i f v , j f u , i + ∑ j = 0 i − 1 f v , i f u , j ) 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}) fu,i′=j=0∑dufv,jfu,i+(j=0∑ifv,jfu,i+j=0∑i−1fv,ifu,j)
记 s u , i = ∑ j < i f u , j s_{u,i}=\sum_{j<i}f_{u,j} su,i=∑j<ifu,j,
f u , i ′ = f u , i ( s v , d u + s v , i ) + f v , i s u , i − 1 f'_{u,i}=f_{u,i}(s_{v,d_u}+s_{v,i})+f_{v,i}s_{u,i-1} fu,i′=fu,i(sv,du+sv,i)+fv,isu,i−1
线段树合并即可。
具体的,由于只需要乘法标记,因而一个不存在的点,其 f f f 值一定为 0 0 0。
代码时注意,可并线段树中
u
u
u 的左右儿子不是 u << 1, u << 1 | 1
!