首页 > 其他分享 >P7154 Sleeping Cows 题解

P7154 Sleeping Cows 题解

时间:2024-02-26 21:01:48浏览次数:30  
标签:方案 匹配 极大 题解 满配 枚举 Cows P7154 sim

传送门

题意:给定两个数组 \(a_i,b_i\),若 \(a_i\le b_j\),则他俩可配对。求极大匹配的方案数。(极大不是最大,最大一定是极大

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

把 \(a\) 和 \(b\) 从小到大排序。则每个 \(a_i\) 能匹配的 \(b\) 都是一段后缀,且随着 \(i\) 增大,这个后缀越来越小。

于是从 \(a_n\) 向 \(a_1\) 遍历,如果现在遍历到 \(a_i\),且 \(a_i\) 能匹配 \(b_j\sim b_n\)。令答案乘以 \((n-j+1)-(i-1)\),即原本 \(n-j+1\) 个选择,前面的消耗了 \(i-1\) 个。

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

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

对于一个匹配,找到其最小的没有匹配上的 \(a_i\) 和最大的没有匹配上的 \(b_j\)。若 \(a_i\) 和 \(b_j\) 无法匹配,则这个匹配就是极大的。

证明:因为 \(a_i,b_j\) 无法匹配,则 \(a_{i+1\sim n},b_{1\sim j-1}\) 也都无法匹配了。

于是枚举最小的没匹配上的 \(a_i\),由此求出最小的能匹配上 \(a_i\) 的 \(b_t\)。显然 \(b_{t\sim n}\) 必须满配,否则 \(a_i\) 与它们之一可以使匹配数量加一。

同时注意 \(a_{1\sim i-1}\) 也要满配,不然与 \(a_i\) 的 “最小” 矛盾。

因此枚举完 \(a_i\),再枚举 \(a_{1\sim i-1}\) 和 \(b_{t\sim n}\) 之间匹配的对数 \(j\)。(显然这里要满足 \(j\le \min(i-1,n-t+1)\))

假如能求出两个数组:\(f[i][j]\) 表示 \(b_1\sim b_i\) 配出去 \(j\) 条边的方案数;\(g[i][j]\) 表示 \(a_{i+1}\sim a_n\) 配出去 \(j\) 条边的方案数。

则答案即为 $$\sum_{i,j} f[t-1][i-1-j]\cdot g[i+1][(n-t+1)-j]\cdot j!$$

解释一下。\(\sum_{i,j}\) 就是枚举 \(i,j\)。既然 \(a_1\sim a_{i-1}, b_t\sim b_n\) 匹配了 \(j\) 条,且它们俩都要满配,所以 \(a_1\sim a_{i-1}, b_1\sim b_{t-1}\) 匹配了 \((i-1)-j\) 条,\(a_{i+1}\sim b_t\sim b_n\) 匹配了 \((n-t+1)-j\) 条。

而 \(a_1\sim a_{i-1}, b_1\sim b_{t-1}\) 匹配了 \((i-1)-j\) 条的方案数恰好就是 \(f[t-1][(i-1)-j]\)。

为什么?\(f\) 的定义是 \(b_1\sim b_{t-1}\) 能匹配 \(a_1\sim a_n\),现在只匹配 \(a_1\sim a_{i-1}\),为什么对?

这是因为 \(b_t\) 已经是最小的能匹配 \(a_i\) 的了。所以 \(b_1\sim b_{t-1}\) 都匹配不了 \(a_i\),所以 \(b_1\sim b_{t-1}\) 实际上也就只能匹配 \(a_1\sim a_{i-1}\)。

同理,\(a_{i+1}\sim b_t\sim b_n\) 匹配了 \((n-t+1)-j\) 条 的方案数是 \(g[i+1][(n-t+1)-j]\)。

在 \(a_{i+1}\sim a_n,b_1\sim b_{t-1}\) 匹配完上面的之后,\(a_1\sim a_{i-1},b_t\sim b_n\) 都还剩 \(j\) 个没匹配。因为 \(a_i\) 都能匹配 \(b_t\sim b_n\),所以 \(a_1\sim a_{i-1},b_t\sim b_n\) 就是随便匹配,方案数是 \(j!\)。

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

标签:方案,匹配,极大,题解,满配,枚举,Cows,P7154,sim
From: https://www.cnblogs.com/FLY-lai/p/18035151

相关文章

  • P4708 画画 题解
    先叠层甲。此解法非本题正解如果想看正解可以去看上面\(Sdchr\)或\(Log_x\)大佬的。第一眼看到此题,\(N\)个点的无标号的每个连通块有欧拉回路的图的个数。这不就是\(N\)阶赛德尔矩阵的个数吗?什么?你不知道赛德尔矩阵是什么。没关系。这东西是个很小众的东西。百度上都......
  • 2..3...4.... Wonderful! Wonderful! 题解
    2..3...4....Wonderful!Wonderful!题目描述​ 有一个元素等于其下标的数组,长度为n,对于属于区间\([1,(n-1)/2]\)的每一个数,我们称其为k,我们可以对数组进行任意次数的操作。​ 操作:选择长度为\(2*k+1\)的子序列,然后只留下最中间的那个数,删掉其他的元素。​ 我们想知道对于每个......
  • QT多线程实现-----问题解决及实现方式
    一、概述恰巧正在做一个多线程通信的项目,具体功能是与下位机交互和文件发送,在子线程中实现命令发送和文件传输。使用movetothread主要遇到以下几个问题:1.Socketnotifierscannotbeenabledordisabledfromanotherthread。2.子线程完成文件传输,发送信号......
  • P1119 灾后重建题解
    目录思路代码\(原题传送门\)思路首先先来分析一下算法,Floyd算法的时间复杂度是\(O(n^3)\)虽然很多,但在这一题里很合适。dijkstra算法用堆优化的时间复杂度是\(O(m\logn)\),在这一题里会超时。Bellman–Ford算法的时间复杂度是\(O(mn)\),会超时。所以说这一题是能用Flo......
  • 2024牛客寒假算法基础集训营6 K 错综的统一 题解
    Question2024牛客寒假算法基础集训营6K错综的统一一个矩阵仅由"r",“e”,“d”组成一个矩阵区域是美丽的,当且仅当:在矩形区域内,任意横向或纵向取一个长度大于\(1\)的连续字串是,该字符串都不是回文的现在有\(Q\)次询问,每次给定一个矩阵,问最少修改多少字符(字符只能修改"r"......
  • LG5290/LOJ3052 春节十二响 题解(启发式合并)
    考虑当这个东西是一条链的时候我们该怎么做,显然\(1\)​会有两个儿子,然后两个儿子分别是一条链。所以我们可以给两个儿子的链上的所有节点分别加到两个堆里,每次取出两个堆的最大值加入到我们选择的答案中,然后把两个堆的最大值全部pop掉。最终的答案就是我们pop完一个堆之后,......
  • 【Python】conda基本使用、pip换源、pip超时问题解决
    conda问题往期笔记conda安装:https://www.cnblogs.com/mllt/p/Anaconda-install.htmlconda基础操作https://www.cnblogs.com/mllt/p/jqsj_base_000.html创建环境命令行创建环境的方式见上文“conda基础操作”后面的链接文章。在此演示的是使用pycharm创建conda虚拟环境......
  • P1975 [国家集训队] 排队 题解
    题目链接:排队水紫,\(n\)不大,树套树或者分块都能做。分块的话,最优序列分块套套值域分块最优。观察到是可差性问题维护,即权值数量维护,那我们就树状数组套权值线段树即可。由于\(n\)不大,我们可以不用回收标记,直接数组空间开大点就行。我们预处理出初始逆序对,每一次操作都是基于......
  • 2024牛客寒假算法基础集训营6 H 纷乱的红线 题解
    Question2024牛客寒假算法基础集训营6H纷乱的红线小红拿到了一个圆,以及平面上有\(n\)个点(保证没有三点共线)。现在小红将随机取\(3\)个点画一个三角形,她想知道这个三角形和圆的交点数量的期望是多少?Solution考虑到\(n\le1000\)可以枚举每一条线,计算这一条线和圆的交......
  • AT_abc213_d [ABC213D] Takahashi Tour 题解(图&深搜)
    传送门题意有一个\(n\)个点的无向图。从根节点\(1\)开始,按如下规则遍历整个图:如果有连接这个点的其他点没有走过,则到这个点。如果有多个点,那么按从小到大的顺序走。如果有这个点没有其他点或者连接这个点的其他点都走过了,那么:如果这个点是根节点\(1\),结束。否则回......