【做题记录】HEOI2013 SAO
-
\(\text{HEOI2013 SAO}\)
- 算法:dp
题目:
给出一棵边有方向的树,求该图的拓扑序数量。
\(n\le 10^3\)
题解:
先将这玩意当做普通的树来做。
设 \(f_{u,i}\) 表示节点 \(u\) 在子树中的排名为 \(i\) 的方案数。
那么考虑类似于树形背包,将 \(v\) 加入子树 \(u\) 来转移。
- \(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}
\]
- \(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)\)。

浙公网安备 33010602011771号