P7154 Sleeping Cows 题解

传送门

题意:给定两个数组 ai,bi,若 aibj,则他俩可配对。求极大匹配的方案数。(极大不是最大,最大一定是极大

先考虑最大匹配方案数怎么求。

ab 从小到大排序。则每个 ai 能匹配的 b 都是一段后缀,且随着 i 增大,这个后缀越来越小。

于是从 ana1 遍历,如果现在遍历到 ai,且 ai 能匹配 bjbn。令答案乘以 (nj+1)(i1),即原本 nj+1 个选择,前面的消耗了 i1 个。

接下来考虑极大匹配方案数。

怎么描述一个匹配是 “极大” 的?

对于一个匹配,找到其最小的没有匹配上的 ai 和最大的没有匹配上的 bj。若 aibj 无法匹配,则这个匹配就是极大的。

证明:因为 ai,bj 无法匹配,则 ai+1n,b1j1 也都无法匹配了。

于是枚举最小的没匹配上的 ai,由此求出最小的能匹配aibt。显然 btn 必须满配,否则 ai 与它们之一可以使匹配数量加一。

同时注意 a1i1 也要满配,不然与 ai 的 “最小” 矛盾。

因此枚举完 ai,再枚举 a1i1btn 之间匹配的对数 j。(显然这里要满足 jmin(i1,nt+1)

假如能求出两个数组:f[i][j] 表示 b1bi 配出去 j 条边的方案数;g[i][j] 表示 ai+1an 配出去 j 条边的方案数。

则答案即为 i,jf[t1][i1j]g[i+1][(nt+1)j]j!

解释一下。i,j 就是枚举 i,j。既然 a1ai1,btbn 匹配了 j 条,且它们俩都要满配,所以 a1ai1,b1bt1 匹配了 (i1)j 条,ai+1btbn 匹配了 (nt+1)j 条。

a1ai1,b1bt1 匹配了 (i1)j 条的方案数恰好就是 f[t1][(i1)j]

为什么?f 的定义是 b1bt1 能匹配 a1an,现在只匹配 a1ai1,为什么对?

这是因为 bt 已经是最小的能匹配 ai 的了。所以 b1bt1 都匹配不了 ai,所以 b1bt1 实际上也就只能匹配 a1ai1

同理,ai+1btbn 匹配了 (nt+1)j 条 的方案数是 g[i+1][(nt+1)j]

ai+1an,b1bt1 匹配完上面的之后,a1ai1,btbn 都还剩 j 个没匹配。因为 ai 都能匹配 btbn,所以 a1ai1,btbn 就是随便匹配,方案数是 j!

总结:要学会排序简化计数。要学会用 DP 预处理辅助数组,加速计数。

posted @   FLY_lai  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示