P8329 [ZJOI2022] 树 解题报告
P8329 [ZJOI2022] 树 解题报告:
题意
生成两棵 \(n\) 个结点的有根树 \(S,T\),其中 \(S\) 内要求父亲编号小于儿子编号,\(T\) 内要求儿子编号小于父亲编号,求两棵树叶子节点(不包括根)互补的方案数。对于 \(n\in[2,N]\) 求出答案。
\(1\leqslant N\leqslant 500\)。
分析
我的计数力还不高啊/ll。
枚举第一棵树的叶子集合,第二棵树的叶子集合为恰好,容斥成钦定:(\(f_1(S)\) 为第一棵树叶子集合为 \(S\) 的方案数,\(f_2(S)\) 为第二棵树非叶子集合为 \(S\) 的方案数)
\[\sum_Sf_1(S)\sum_{T}(-1)^{|S|-|T|}f_2(T)=\sum_S(-1)^{|S|}f_1(S)\sum_{T}(-1)^{|T|}f_2(T)
\]
考虑对这个式子直接 dp,令 \(f_{k,i,j}\) 表示 dp 到了编号 \(k\) 的结点,目前前面钦定了 \(i\) 个非叶子结点,后面提前钦定了 \(j\) 个非叶子节点的容斥系数和。
分讨列出转移方程,大概就是枚举结点分配给哪棵树,然后再确定另一棵树是否钦定它来容斥(很神秘):
- 这个结点分配为第一棵树的叶子,第二棵树钦定:\(f_{k+1,x,y}\leftarrow -xyf_{k,x,y}\);
- 这个结点分配为第一棵树的叶子,第二棵树不钦定:\(f_{k+1,x,y}\leftarrow xyf_{k,x,y+1}\);
- 这个结点分配为第二棵树的叶子,第一棵树钦定:\(f_{k+1,x,y}\leftarrow -xyf_{k,x,y}\);
- 这个结点分配为第二棵树的叶子,第一棵树不钦定:\(f_{k+1,x+1,y}\leftarrow xyf_{k,x,y}\)。
复杂度 \(O(n^3)\)。
代码
数据出了就补。