18
两棵树无法被区分,当且仅当两棵树「 一个点到根的路径上的所有点的子树大小构成的集合」构成的集合相同。
设 \(dp_{i,j}\) 表示 \(j\) 棵大小为 \(i\) 的树(不区分顺序)的方案数。那么
\[\begin{align}
dp_{i,j}=\sum_x\sum_k dp_{i,j-k}\times
\begin{cases}
dp_{x,k\times 2} & \text{if } x\times 2=i \\
dp_{x,k}\times dp_{i-1-x,k} & \text{if } x\times 2\not=i
\end{cases} \\
\end{align}
\]
转移的时候得先枚举 \(x\),再枚举 \(j\),这是为了保证不算重。
https://www.luogu.com.cn/problem/P8959
考虑给出的如果是一棵内向树该怎么做。把操作离线下来,在每个点上维护一棵时间轴线段树,支持后缀加、前缀求区间 \(\max\)、合并两棵线段树。直接做就可以了,复杂度是 \(O(n\log n)\) 的。
其实直接在有向树上套用上面这个做法,复杂度还是 \(O(n\log n)\) 的。这是因为执行 \(x\rightarrow y,x\rightarrow z\) 两次合并肯定不劣于 \(x\rightarrow y,y\rightarrow z\) 两次合并,而不断把 \(x\rightarrow y,x\rightarrow z\) 变成 \(x\rightarrow y,y\rightarrow z\) 直到无法操作后,有向树就会变成内向树。

浙公网安备 33010602011771号