Hall定理
设二分图左右两部分为 (X, Y), 则:
**二分图存在完美匹配 (Leftrightarrow) $ forall X' subseteq X, F(X') >= |X'|$ **
((F(X')) 为 (Y) 中与 (X') 中任意点相连的点的个数; 或者说, 在 (Y) 中, 有且仅有 (F(X')) 个点与 (X') 中的点有连边)
证明: (后者为前者的充要条件) (均为感性伪证,一些感想,算不得证明, 我太弱了QwQ, 不喜勿喷, 可以交流呀)
- 充分性证明:
假设存在二分图没有完美匹配, 但满足后者 (记为 (q) )
记二分图的两部分为 (X,Y)
那么设该二分图存在最大匹配, 该匹配所对应的点集分别为 (X', Y') ( (X' subsetneqq X, Y' subsetneqq Y) )
对于元素 (a) ( (a in X, a otin X') )
因为它没有被匹配, 意味着它所有可能的对应点都被匹配了 ([1.1])
强行令 (a) 匹配其可行的对应点 (b), (b) 原先必然匹配了一个点 (c), 否则 (a) 早就匹配了 (b)
由 (q), 对于 $ {a, c} $ 它的对应点的集合大小为 (2), 同时 $ {a},{c}$ 的对应点的集合大小都至少为 (1)
-
如果说此时 (c) 没有可行的对应点(包括已经被匹配的) 了, 那么说明 ({a}) 的 对应点的集合大小 至少为 (2), 因为如果对应点的集合大小为 (1), 说明仅有 (a-b,c-b) 两条边, 显然, 这样并不满足 (q)
那么 (a) 可以放弃与 (b) 链接, 寻找另一个可行对应点链接
-
如果说此时 (c) 还有可行的对应边, 此时 (c) 可以继续做 (a) 之前做过的事
若不存在环, 存在链, 进行如上两个操作最终能完成, 因为每次相当于访问过一个结点 ( 除非点集无限...... )
若存在环, 由二分图定义(还是性质?)显然可知, 该环为 偶环, 我们可以设该环点集为 ({v_1, v_2,...v_n}) (相邻标号点有连边, (v_1) 与 (v_n) 有连边, (n) 为偶数), 那么我们显然可以构造一个方案, $v_1-v_2 , v_3-v_4, ... ,v_{n-1}-v_n $, 注意到, 这样再向外扩展也是可以的, 只是相当于把链接点再作为新的起点
- 必要性证明:
既然存在完美匹配, 那么我们把匹配完成的的 匹配边集 这样表示 ({x_1-y_1, x_2-y_2, ..., x_n-y_n})
((F(X')) 为 (Y) 中与 (X') 中任意点相连的点的个数; 或者说, 在 (Y) 中, 有且仅有 (F(X')) 个点与 (X') 中的点有连边)
显然, 对于 (forall x_0 in X, F({x_0}) >= 1), 因为已经存在了匹配, 说明至少必有一条匹配边
由 匹配一一对应 知, 若有 (X' subseteq X), (F(X') >= |X'|) ( (|X'|) 即为 (X') 的集合大小, 或者说它所包含的元素个数 )
上面的 (">=") 可以理解为, (X') 已经匹配的点的个数为 (|X'|), 但可能其中还有点可以匹配不在 (X') 当前对应匹配集合的点
(证毕)
参考了神仙学姐 litble 的课件中的一部分
参考了百度百科
(什么鬼, 我看不懂)
应用
显然, 如果要证明有完美匹配, 枚举子集不太现实 (但还真有毒瘤出题人这么做了)
根据学长 (boshi) 给我的信息, 现在市面上的题目, 一半是用 hall定理 处理区间上的, 一半是用 hall定理 证明某种结论的
虽然很多我还没有见过......
loj6062
给定两个序列 (a_i) (长度为 (n) ) 和 (b_i) (长度为 (m) ), (a_i) 与所有和它的和大于等于 (h) 的 (b_j) 连边,问
(a) 中存在多少个长度为 (m) 的连续子序列,使得和 (b) 完美匹配。( (n, m ≤ 150000))
啊这......
看到 大于等于, 显然有 (a_i + b_j >= h) , 注意到 (h) 是定值
因为 (a_i, b_j) 是 散乱 的 ((a_i, b_j) 满足如上条件), 我们就很想让它们有序
因为 问 (a) 中存在多少个长度为 (m) 的连续子序列 , 所以 (a) 不能改变, 但是可以给 (b) 由大到小 排序
显然, 对于 (a_i), 它跟 (b) 的连边必然是 (b) 的一个后缀
由上句知, (forall i in [1,m), F(b_i) <= F(b_{i+1})) ( (F(b_i)) 为与 (b_i) 连边的点的数量 )
因为 问 (a) 中存在多少个长度为 (m) 的连续子序列 , 所以就有种像 滑动窗口 的感觉
下面的情况均在 (a) 取一个窗口的情况下讨论
这里我们推出一个本题的结论:
该窗口存在与 (b) 的完美匹配 $ Leftrightarrow$ (forall i in [1, m), F(b_i) >= i)
若 (F(b_i) < i) , 由 hall定理 知 不存在完美匹配, 因为 ({b_1,b_2,...,b_i}) 是 (b) 的一个子集
否则, 对于任意一段 (b' subseteq b) , (b') 的起始位置和结束位置分别为 (s,t)
(b_{1,2,...,s-1}) 的已经匹配完成, 占了 (s-1) 个位置 ( 注意到对于 (b_i, b_j, i<j), (b_j) 对应的匹配位置一定包含了 (b_i) 对应的匹配位置), (F(b_t) >= t)
所以, (F(b_t)-(s-1) >= t-(s-1) = t-s+1), 后者即 ([b_s, b_t]) 的长度
对于不连续的段, 那么对于每段都满足上面这个结论
所以, 综上, 我们只用判定对于每个 (i), 是否 (F(b_i) >= i) 即可
变形得, (F(b_i)-i>=0)
因为是带修改区间问题, 我们可以使用 线段树
建一颗长度为 (m) 的线段树, 对于 (i) 号叶子结点, 在最开始时减去 (i), 查询时, 询问整个区间最小值是否大于等于 (0) 即可
收获:
-
对于序列上的题目, 运用 hall定理 需要发现序列的 性质
-
对于序列上的题目, 运用 hall定理 往往需要辅助数据结构 ( 线段树, 树状数组...... )
BZOJ3693
有 (n) 组人要一起开一个圆桌会议(编号为(0) ~ (n-1)), 会议的圆桌上有 (m) 个位置( 编号为 (0) ~ (m-1) ). 每个组有 (a_i) 个人, 他们需要被安排在( (l_i), ((l_i+1)%m), ((l_i+2)%m), (...) , (r_i) )的座位范围内. 每个座位只能安排一个人就坐, 并且每个人都需要被安排一个座位. 现在你需要判断是否存在满足条件的座位安排, 对于每组数据, 输出 (Yes) 或 (No)
不超过 (10) 组数据, (n leq 10^5, m leq 10^9)
首先对于环, 断环为链
这题相当于 每一个人 要匹配一个座位 ( 以人为 (X) 集 )
但是, 注意到 (m leq 10^9), 说明人必然不少
而对于一个人而言, 他的可选位置很多
而对于每一组而言, 这一组会与其它组休戚相关, 考虑起来很麻烦
那么我们换一种考虑方式 ( hall定理 变了味? )
我们以座位为考虑对象
对于任意一段位置 ([L,R]), 我们考虑这一段位置是否能让所有满足 (L leq l_i, r_i leq R) 的组区间 ([l_i, r_i]) ( 即被完全包含 ) 都能坐下
我们不考虑一部分在这座位区间的组 ( 即不被完全包含的组, 或者说与这个座位区间有交集但不是包含关系的组 ), 因为注意上面的 "任意一段位置 ([L,R]) ", 总会有其它座位区间考虑到它的
为了优化复杂度, 我们考虑最极端的情况
假设一段位置区间为 ([L,R]), 其中被完全包含的组人数之和记为 (sum), 这些组分别为 ([l_i,r_i],[l_{i+1},r_{i+1}],...,[l_j,r_j])
显然需要满足 (R-L+1 geq sum)
为了保证极端情况, 很显然, (L = min{l_k|k in [i,j]}, R = max{r_k|k in [i,j]})
现在考虑怎么把左边尽可能地小, 右边尽可能地大
变形不等式
(R-L+1 geq sum Rightarrow R + 1 - ( sum+L) geq 0)
显然就是要左边尽可能地小
(R) 对于每一个询问都知道了
显然可以把左端点离散化开一颗线段树, 每次就把 (l_j leq l_i) 的地方加上 (a_i), 预先加上 (l) 就好了
每次查最大值
(留坑)