Hall
Hall 定理普通点来说,就是对于一个二分图枚举一部点的所有子集,其所有出度对应的点的并的大小都大于等于枚举子集大小,那么二分图拥有完美匹配。
这个东西有几个拓展。先提最重要的一个。
二分图最大匹配就等于 ,其中 就是 所有出度对应的点的并大小。(扩展)
还有一个什么任意 阶正则二分图,即左右两边的点的度数都是 ,如果两端点数相同,那么存在完美匹配。感觉没什么用。
CF981F Round Marriage
个新郎和 个新娘围成一个环,长度为 ,第 个新郎位置为 ,第 个新娘位置为 ,需要将他们两两配对,最小化新郎和新娘距离的最大值。
。
首先一定有二分答案。剩下的就是求一个点连向环上一个区间形成的二分图是否有完美匹配。我们断环为链,显然顺时针枚举新郎找到的区间是两端点均递增的,所以无法满足的子集一定可以被描述为一个区间。
那么扫一遍,特判有点没有被连接,此时 一定能被描述为一个区间,维护这个区间右端点至少要到哪里即可。
P3679 [CERC2016] 二分毯 Bipartite Blanket
在二分图中,所有点被划分成了两个不相交的集合 和 ,每条边都恰好连接着某个 和某个 。一个匹配是一个边集,满足没有任何两条边有相同的端点。我们称一个匹配 覆盖了点集 当且仅当 中的每个点都是 中至少一条边的端点。
给定一个二分图,每个点有一个正整数权值。定义一个点集的权值为其中所有点的权值之和。
给定一个参数 ,请统计有多少点集 ,满足 的权值不小于 ,且 被至少一个匹配 覆盖。
,,。
因为这个 是点集,在没有性质的情况下,如果需要满足 的权值不小于 ,大多是需要枚举所有子集或者折半的。
哦?折半?这个题在极限情况下,我们可以理解为 就是折半出来的产物,所以我们可以尝试在满足被匹配 覆盖的前提下,将左右两边分开处理。
这里我们引出 Hall 定理的一个拓展:
一个点集在一个匹配中的充要条件是点集分开的左部点集合和右部点集合均可能在一个匹配中。
证明就略去了,可以画一个图稍微理解一下。
然后这个题就简单一点了。用一个高维前缀与模拟最普通的 Hall 定理来算出有哪些点集可以在匹配中,然后用一个双指针就能求出有多少点集被至少一个匹配 覆盖。
CF1373G Pawns
的棋盘上,第 行是特殊行, 表示第 行,第 列,这个位置的兵可以走到 。
每个兵都要走到第 行,不能有两个兵重合,可以在棋盘后添加若干列让每个兵都能走到第 行。
初始状态没有兵在棋盘上,现在有 个操作,将 的状态改变,有兵则拿掉,没兵则添加。求每次操作后求需要最少要添加几列。
。
首先读题是重要的。显然我们无需保证移动过程中没有多个兵在同一个点上的情况。这样一个兵的贡献就是一段后缀,即它能走到一段后缀。
考虑如何求答案。考虑扩展 Hall 定理,考虑求有多少点指向这个后缀。使用线段树维护扩展 Hall 定理的式子,注意只有有后缀贡献的最前面的地方才参与求最大值评定。具体就是,开一个长度为 的线段树,初值为 ,表示 ,我们只需要维护 就行了。
所以对于一个兵,是一个前缀加,最后求 的值即可。
[ARC076F] Exhausted?
有 个椅子在数轴上排列,第 张椅子的坐标为i。
高桥君和他的朋友一共有 个人。高桥君他们因为玩了太久的游戏,大家的腰和背都很痛,所以他们很有必要坐在椅子上休息一下。
高桥君他们每个人坐的椅子的坐标都很讲究,第 个人想坐在坐标在 以下(包括 )的椅子上,或者坐在坐标在 以上(包括 )的椅子上。当然,一个的椅子只能坐一个人。
可这样计算下去,可能会让他们不能都坐在椅子上休息。青木君关心高桥君他们的健康,尽可能多地增加椅子,让高桥君他们都能够坐在椅子上休息。 椅子可以添加到任意的实数坐标上,请求出需要添加椅子数量的最小值。
。
这个题和上一个题的差别就是, 变成了一段前缀加一段后缀。这个时候考虑枚举 的补,使用扫描线维护。
每次全局减一( 的补减 , 加 ),然后加入一些 ,贡献显然是一段前缀。然后就做完了。
CF1519F Chests and Keys
最后一个题。
给定 表示存在 个宝箱和 把钥匙,第 把钥匙需要 元,第 个宝箱内部有 元。
现在进行一场游戏,Bob 是本场游戏的玩家,而 Alice 则是场景布置者,Alice 可以给每个宝箱上一些锁(第 种锁需要第 种钥匙打开)
如果 Bob 可以购买一些钥匙,然后打开一些宝箱,使得 Bob 的收益大于 ,那么 Bob 就赢得了游戏,反之 Alice 获得了胜利。
现在 Alice 打算布置宝箱上的锁,第 个宝箱上放置第 种锁的花费为 ,请帮助 Alice 找到一种布置锁的方案,使得花费最小,且 Alice 将取得胜利。
。
特别的,一个箱子上可以放置若干把锁,Bob 需打开所有锁才能获得内部的钱。当然,可以有多把相同种类的锁。
我们列出合法的式子:
很像 Hall 定理的式子对吧!所以我们把箱子的点拆成 个点,钥匙的点拆成 个点,我们需要保证箱子侧有完美匹配。
暴力状压 DP 这个完美匹配,五进制压缩右部点目前连接情况,每次加 条匹配,直接计算贡献即可。理论上界复杂度为 ,但是能跑的很快。
本文作者:xingyu_xuan
本文链接:https://www.cnblogs.com/xingyuxuan/p/18553142
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步