这道题放在T2好像不太合适……
# 题面
点击展开/折叠 题面
给定一个点数为 $n$ 的仙人掌 $G$ 以及起点 $S$,保证仙人掌没有奇环,设 $d_i$ 表示 $i$ 与 $S$ 的最短距离(边的长度均为 $1$)。
你需要计算有多少个 $1\sim n$ 的排列 $P$,使得对于任意 $(i,j)$,若 $d_i< d_j$,则 $p_i< p_j$。
$1\le n\le5000$(虽然勉勉强强可以开到 $10^4$)
# 解析
发现 $O(n^2)$ 可过,于是有两种做法~
- 正向DP
跑一遍最短路(BFS)过后可以给每条边定向得到一个有向图,于是称一个点 $u$ 经过有向边能到达的点为 $u$ 的后继。按照题目的意思,$u$ 的后继 $v$ 一定有 $p_u< p_v$。
先考虑简单的情况——一棵树,则 $u$ 的后继就是 $u$ 的子树。设 $g_u$ 表示 $u$ 及 $u$ 的子树内的合法的 $P$ 的方案数(子问题)。
子树 $v$ 合并到 $u$ 上时,要保证 $u,v$ 原来的 $P_u,P_v$ 的顺序,而 $u,v$ 之间的顺序是没有要求的,于是可以在合并后的 siz[u]+siz[v]
个位置中挑选出 siz[v]
个位置分配给 $P_v$,即
再把环给加上。
定义一个环上 $d_i$ 最小的点 $i$ 为环的“顶点”,因为是仙人掌,所以每个环只有一个顶点;又因为只存在偶环,所以每个环上只有一个 $d_i$ 最大的点,称为环的“中点”。
环的顶点一定是 $p$ 最小的,因此可以删掉顶点,然后环就有了两个端点,则只需要决策两端点哪一个 $p$ 更小。
定义 $f_{i,j}$ 表示当前已经决策了 $i,j$ 及其后继的 $p$ 的合法方案数。如果让 $i$ 的 $p$ 更小(让 $j$ 的 $p$ 更小是差不多的),如图:
此时 $g_i$ 已经计算出了 $i$ 以及图中 $siz’$ 的 $P$ 的方案数。设 $i,j$ 及 $i,j$ 后继的数量共有 $tot$ 个,则需要从 $tot$ 个位置中:先把最小的 $p$ 留给 $i$,然后保持 $g_i$ 对应的排列的顺序,只需要从剩下的 $tot-1$ 个位置中选出 $siz’$ 个。即 $\binom{tot-1}{siz’}f_{i+1,j}g_i$
于是总的转移式就是:
最后把整个环的 $f$ 转移到其顶点 $u$ 的 $g_u$ 上就可以继续转移了。
实现的时候建圆方树要方便一些,而且可以把不在环上的边看成一个只有两个点的环,那么在圆方树上一定是圆方交替,就可以少些特判。
- 反向DP
即从 $n!$ 全排列中删去不合法的。
从更为简单的链开始考虑,设 $i$ 之后的点的 $p$ 已经决策好了
则此时在全排列中,$p_1< p_2< p_3$,那么 $p_i$ 在不考虑 $i$ 的合法性的全排列中的取值将有 $p_i< p_1$、$p_1< p_i< p_2$、$p_2< p_i< p_3$、$p_3< p_i$ 这 $4$ 类,且每一类对应的排列数相同。
但是只有 $p_i< p_1$ 这一类是合法的,于是总排列数除以4得到合法的排列数。
不难发现,在决策 $i$ 时,会有 siz[i]
种类型,而只有一种类型是合法的,因此总排列数除以 $siz_i$。于是链的方案数只有 $\frac{n!}{\prod siz_i}=1$
实际上链的结论可以扩展到树上,在 $u$ 的子树内的排列 $P_u$ 中,$p_u$ 的取值也有 $siz_u$ 类,除以 $siz_u$ 同理。即树的结论是 $\frac{n!}{\prod siz_i}$。
然而这个结论不能直接用在仙人掌上,就是因为有环。不过可以发现仙人掌上的环的贡献(从全排列中除去不合法的贡献)是互相独立的,于是考虑对每个环进行DP。
$f_{i,j}$ 表示环内已经决策 $i,j$ 及其后继的 $p$ 的大小关系,除去的不合法的方案数是多少(一个分数)。
(仍然沿用“正向DP”中对环上的点的一些称谓)
中点 $mid$ 的 $p$ 一定小于其后继节点(不在环上),则 $f_{mid,mid}=\frac1{siz_{mid}}$。若使 $p_i< p_j$,设 $i,j$ 的后继共有 $tot$ 个,则在 $tot$ 类 $p_i$ 的取值中,只有 $p_i$ 最小的一种合法,则 $f_{i,j}=\frac{f_{i+1,j}}{tot}$,其中 $tot=siz_i+siz_j-siz_{mid}$;实际上 $p_j< p_i$ 的情况是完全一样的,即:
环的顶点的贡献直接是 $\frac1{siz}$,因为它的 $p$ 一定是最小的。
另外还有一些点不在环上,和顶点同理,贡献是 $\frac1{siz}$。
# 源代码
- 正向DP
1 | /*Lucky_Glass*/ |
- 反向DP
1 | /*Lucky_Glass*/ |
THE END
Thanks for reading!
> Linked 不可道-网易云