【做题记录】HEOI2013 SAO

  • \(\text{HEOI2013 SAO}\)

    • 算法:dp

题目:

给出一棵边有方向的树,求该图的拓扑序数量。

\(n\le 10^3\)

题解:

先将这玩意当做普通的树来做。

\(f_{u,i}\) 表示节点 \(u\) 在子树中的排名为 \(i\) 的方案数。

那么考虑类似于树形背包,将 \(v\) 加入子树 \(u\) 来转移。

  1. \(v\) 连向 \(u\)

所以 \(u\) 拓扑序比 \(v\) 大。

\(u\) 原来的排名为 \(p\)\(v\) 原来在其子树中的排名为 \(q\)

\(f_{u',k}\)\(u\) 加入 \(v\) 这棵子树后 \(u\) 排名为 \(k\) 的方案。

那么 \(v\) 中就必然有 \(k-p\) 个节点的拓扑序比 \(u\) 小。而 \(v\) 的排名比 \(u\) 前。

所以转移的限制是 \(q\le k-p\)\(p+q\le k\)

考虑现在比 \(u\) 小的节点有 \(k-1\) 个,原来比 \(u\) 小的有 \(p-1\) 个,显然这些点是确定的,所以只需要考虑顺序,方案数为 \(\dbinom{k-1}{p-1}\)。那么剩下比 \(u\) 排名大的同理方案数为 \(\dbinom{sz_u+sz_v-k}{sz_u-p}\)

所以可得转移为

\[f_{u',k}=\sum_{p=1}^{sz_u}\sum_{q=1}^{sz_v}[p+q\le k]f_{u,p}f_{v,q}\dbinom{k-1}{p-1}\dbinom{sz_u+sz_v-k}{sz_u-p} \]

  1. \(u\) 连向 \(v\)

与第一种同样的方法。

直接上转移:

\[f_{u',k}=\sum_{p=1}^{sz_u}\sum_{q=1}^{sz_v}[p+q> k]f_{u,p}f_{v,q}\dbinom{k-1}{p-1}\dbinom{sz_u+sz_v-k}{sz_u-p} \]

考虑优化。

先提出 \(p\)

\[f_{u',k}=\sum_{p=1}^{sz_u}f_{u,p}\dbinom{k-1}{p-1}\dbinom{sz_u+sz_v-k}{sz_u-p}\sum_{q=1}^{k-p}f_{v,q} \]

\[f_{u',k}=\sum_{p=1}^{sz_u}f_{u,p}\dbinom{k-1}{p-1}\dbinom{sz_u+sz_v-k}{sz_u-p}\sum_{q=k-p+1}^{sz_v}f_{v,q} \]

发现直接搞一个前缀和就好了。

\(s_{u,i}\)\(f_{u,i}\) 的前缀和。

\[f_{u'k}=\sum_{p=1}^{sz_u}f_{u,p}\dbinom{k-1}{p-1}\dbinom{sz_u+sz_v-k}{sz_u-p}s_{v,q} \]

\[f_{u'k}=\sum_{p=1}^{sz_u}f_{u,p}\dbinom{k-1}{p-1}\dbinom{sz_u+sz_v-k}{sz_u-p}(s_{sz_v}-s_{k-p}) \]

时间复杂度 \(O(n^2)\)

posted @ 2022-01-17 21:12  trsins  阅读(41)  评论(0)    收藏  举报