SOJ1630 二叉树比大小 题解

传送门

题意

\(0\) 代表空树,如果一个节点没有左子树,那么认为它的左子树是空树(右子树同理)。对任意二叉树 \(A\)\(0≤A\) 成立;对任意非空二叉树 \(A\)\(A≤0\) 不成立。用 \(ls\) 代表左子树,\(rs\) 代表右子树,则对于非空二叉树 \(A,B\)\(A≤B\) 当且仅当 \(ls(A)≤ls(B)\)\(rs(B)≤rs(A)\)\(A=B\) 当且仅当 \(A≤B\)\(B≤A\)。否则 \(A≠B\)
给定节点编号为 \(1∼n\) 的二叉树 \(A\)\(B\) 的初始值为 \(A\)。对 \(B\) 重复进行以下操作:任选 \(B\) 中的一个儿子数量不超过 \(1\) 的节点,为这个节点增加一个儿子(使得 \(B\) 仍然是二叉树)。左右有区别。
问共有多少不同(定义见上文) 的 \(B\) 满足 \(B\) 的节点数为 \(n+m\)\(A≤B\)
\(1 \le n,m \le 10^6\)

题解

若两个对应的节点关系为 \(≠\),则最后 \(A≠B\)。故所有对应节点要么 \(A \le B\),要么 \(B \le A\)。由题意,我们发现对于给定形态的树 \(A\),对应节点的大小关系是确定的,且很好求:根节点 \(A \le B\),所有点的左子树与其相同,右子树与其相反。于是可以挂新节点的节点是确定的,且相互独立。
此时问题转化为:有 \(c\) 个独立的位置,放置 \(m\) 个节点形成二叉树森林,求方案数。这是卡特兰数的加强版,\(c=1\) 时即为卡特兰数。
\(f[c][m]\) 表示上述结果。易得递推式为

\[f[c][m]=\sum_{i=0}^{m}f[1][i] \times f[c-1][m-i] \]

复杂度 \(O(n^3)\)
在此基础上可以对 \(c\) 用类似快速幂的方法优化至 \(O(n^2\log n)\),再用三模 NTT 优化至 \(O(n \log^2 n)\)。但常数过大,只有 \(60pts\)
换一种思考角度:若第 \(c\) 个位置大于 \(0\),则可以拿走根节点,将其分为两个相互独立的位置;若等于 \(0\),则可以删去一个位置。于是得到 \(O(n^2)\) 的递推式

\[f[c][m]=f[c+1][m-1]+f[c-1][m] \]

将其放在坐标系中,则转化为路径计数:

当一个点位于 \((x,y)\) 时,下一步可以走到 \((x-1,y+1)\)\((x+1,y)\)。且 \(x>0\)。求 \((1,0)\)\((c,m)\) 的方案数。

\((x,y)\) 变换为 \((x+y,y)\),则得到熟悉的形式:

当一个点位于 \((x,y)\) 时,下一步可以走到 \((x,y+1)\)\((x+1,y)\)。且 \(x>y\)。求 \((1,0)\)\((c+m,m)\) 的方案数。

路径计数即可。答案为 \(\binom{c+2m-1}{m}-\binom{c+2m-1}{c+m}\)

posted @ 2022-10-09 09:28  realFish  阅读(62)  评论(0)    收藏  举报