bzoj3693: 圆桌会议 二分图 hall定理】的更多相关文章

目录 题目链接 题解 代码 题目链接 bzoj3693: 圆桌会议 题解 对与每个人构建二分,问题化为时候有一个匹配取了所有的人 Hall定理--对于任意的二分图G,G的两个部分为X={x1,x2,-,xn}和Y={y1,y2,-,ym}, 存在一个匹配M使得|M|=|X|的充要条件为对于X的任意一个子集A,与A相邻的点集记为T(A),一定有|T(A)|≥|A| 拆环为链 对于任意的区间[L,R],长度R-L+1,将所有区间[L,R]内的组插入操作求和为sum,如果sum > R - L + 1…
/* 二分答案,判mid是否合法 如何判断:如果是在直线上,那么遍历匹配即可 现在在环上,即既可以向前匹配也可以向后匹配,那么将环拆开,扩展成三倍 显然a和b的匹配边是不可能交叉的,因为交叉必定没有不交叉优 hall定理:二分图两个点集A,B,连续一段A的点对应连续一段B的点的 充要条件是 这些点对的匹配边之间不交叉 重要推论:二部图G中的两部分顶点组成的集合分别为X,Y, 若|X|=|Y|, 且G中有一组无公共端点的边,一端恰好组成X中的点,一端恰好组成Y中的点,则称二部图G中存在完美匹配 有…
题意 题目链接 Sol 好的又是神仙题... 我的思路:对于区间分两种情况讨论,一种是完全包含,另一种是部分包含.第一种情况非常好判断,至于计算对于一个区间[l, r]的$\sum a[i]$就可以了,但是后两种呢?qwq.想了半天也没想出来.看了下题解,果然还有更高端的操作! 首先这题可以看是二分图匹配,最暴力的写法是对于每个a[i],直接拆成a[i]个点,然后分别向$[l_i, r_i]$连边,最后看是否能完全匹配. 有一个专门判断这玩意儿的定理: Hall定理:二部图G中的两部分顶点组成的…
充分性证明就先咕了,因为楼主太弱了,有一部分没看懂 霍尔定理内容 二分图G中的两部分顶点组成的集合分别为X, Y(假设有\(\lvert X \rvert \leq \lvert Y \rvert\)).G中有一组无公共点的边,一端恰好为组成X的点(也就是存在完美匹配)的充分必要条件是:X中的任意k个点至少与Y中的k个点相邻,即对于X中的一个点集W ,令N(W)为W的所有邻居, 霍尔定理即对于任意W,\(\lvert W\rvert \leq \lvert N(W)\rvert\) 证明 1.必…
[CF981F]Round Marriage(二分答案,二分图匹配,Hall定理) 题面 CF 洛谷 题解 很明显需要二分. 二分之后考虑如果判定是否存在完备匹配,考虑\(Hall\)定理. 那么如果不合法,假设我们存在一个极小的集合满足连到右侧的点数小于集合大小.因为是极小的,所以删去一个点之后就可以匹配,那么意为着某个点连出去的点和其他所有点有交,既然有交,那么一定这一段区间都可以加入进来形成一个不合法的集合.所以我们可以把存在一个点集不合法变成存在一段连续区间不合法. 假设每个点连向另外一…
题意: 给定一个H行W列的矩阵,在矩阵的格点上放带权值的卡片(一个点上能放多张). 现在从每行每列各拿走一张卡片(没有可以不拿),求可以拿到的最大权值. 卡片数N<=1e5,H,W<=1e5 思路: 显然可以构造成一个最大费用流模型:每张卡片到它对应的行列各有一条费用0,容量1的边:源点到每张卡片有一条费用为卡片权值,容量1的边:每个行列到汇点有一条费用0,容量1的边.但是边数有5e5,应该会超时吧? 观察这个图发现除去源点和汇点是一张二分图,想到是否可以利用二分图的性质简化问题. 手动模拟一…
题目链接 先考虑链.题目相当于求是否存在完备匹配.那么由Hall定理,对于任意一个区间[L,R],都要满足[li,ri]完全在[L,R]中的ai之和sum小于等于总位置数,即R-L+1.(其实用不到Hall定理,显然) 为什么不是子集呢,因为区间并和子集等价,所有区间并都是要验证的. 而且可以发现,只有当R为某个r[i],L为某个l[j]时,[L,R]才有必要验证. 所以我们将区间按r[]排序,枚举每个r[i]作为R.限制条件为\(sum<=R-L+1\)即\(sum+L-1<=R\),对于前…
\(Description\) 给定一个\(n\)个点的二分图,每条边有边权.求一个边权最小的边集,使得删除该边集后不存在完备匹配. \(n\leq20\). \(Solution\) 设点集为\(S\),与\(S\)中的点相邻的点的并集为\(N(S)\). 由Hall定理,若存在点集\(S\)满足\(|S|>|N(S)|\),则该图不存在完备匹配. 因为\(n\)很小,直接枚举所有子集\(S\)并贪心删相邻点即可. 另外topcoder跑得快,直接写\(2^n\times n^2\)就好了..…
题目链接 只有指向父节点的单向道路,所以c个人肯定在LCA处汇合.那么就成了有c条到LCA的路径,求最大的x,满足能从c条路径中各选出x个数,且它们不同. 先要维护一条路径的数的种类数,可以树剖+每条链维护一个bitset解决.用vector一条链加一个bitset,SDOI R2现场测过我记得空间还不算特别大..当然本题数字只有1000种,一个点开一个bitset没问题.最后合并时还要通过线段树. 假设答案是x,那么c个人都要从可选特产中不重复地选x个,把每个人拆成x个点就是一个二分图完备匹配…
[BZOJ2138]stone Description 话说Nan在海边等人,预计还要等上M分钟.为了打发时间,他玩起了石子.Nan搬来了N堆石子,编号为1到N,每堆包含Ai颗石子.每1分钟,Nan会在编号在[Li,Ri]之间的石堆中挑出任意Ki颗扔向大海(好疼的玩法),如果[Li,Ri]剩下石子不够Ki颗,则取尽量地多.为了保留扔石子的新鲜感,Nan保证任意两个区间[Li,Ri]和[Lj,Rj],不会存在Li<=Lj&Rj<=Ri的情况,即任意两段区间不存在包含关系.可是,如果选择不…
Description 初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了xi个ri号脚的人.xi为负,则代表走了这么多人. 对于每次操作,输出溜冰鞋是否足够. Input n m k d ( 1≤n≤200,000 , 1≤m≤500,000 , 1≤k≤10^9 , 0≤d≤n ) ri xi ( 1≤i≤m, 1≤ri≤n-d , |xi|≤10^9 ) Output 对于每个操作,输出一行,TAK表示够 NIE…
Hall定理 Tags:图论 zybl 二分图\(G=<V1,V2,E>\)中,\(|V1|<|V2|\),当且仅当\(V1\)中任意\(k(=1,2,3..|V1|)\)个顶点都与\(V2\)中至少\(k\)个点相邻时,该二分图存在完美匹配 证明见此博客 例题见HNOI省队集训…
基本定义 \(Hall\) 定理是二分图匹配的相关定理 用于判断二分图是否存在完美匹配 存在完美匹配的二分图即满足最大匹配数为 \(min(|X|,|Y|)\) 的二分图,也就是至少有一边的点全部被匹配到了 定理 设 \(M(U)\) 为与 \(U\) 中的点相连的点集,一个二分图 \(U,V(|U|<=|V|)\) 存在完美匹配,满足对于任意点集 \(x∈U\) 都有 \(|M(X)|>=|X|\) 必要性证明 连出去的边数都不足点数,那么显然不能构成完美匹配 充分性证明 假如存在一个满足…
[BZOJ2138]stone(线段树,Hall定理) 题面 BZOJ 题解 考虑一个暴力. 我们对于每堆石子和每个询问,显然是匹配的操作. 所以可以把石子拆成\(a_i\)个,询问点拆成\(K_i\)个,这样就是每次进行一次二分图的匹配. 当然可以用网络流+线段树优化连边来做,但是这样复杂度太高. 还是回到二分图的匹配问题,我们现在要验证的就是是否存在对于当前询问点的完美匹配. 关于完美匹配,有\(Hall\)定理,如果存在完美匹配,假设左侧的点有\(|X|\)个,那么这些点连向右边的点的点集…
1135: [POI2009]Lyz Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 573  Solved: 280[Submit][Status][Discuss] Description 初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了xi个ri号脚的人.xi为负,则代表走了这么多人. 对于每次操作,输出溜冰鞋是否足够. Input n m k d ( 1≤n≤2…
---题面--- 题目大意: 有n个人,m个座位,每个人可以匹配的座位是[1, li] || [ri, m],可能有人不需要匹配座位(默认满足),问最少有多少人不能被满足. 题解: 首先可以看出这是一个二分图匹配,根据hall定理,我们只需要求出max(人的子集大小 -  被选出的人可以选的座位集合大小). 但是枚举人的复杂度太高,所以考虑枚举座位集合,因为每个人的可选区间都是一段前缀or后缀,因此要表达一个合法的座位集合,我们只需要所有人中最右边的li和最左边的ri即可. 如图所示: 因此这个…
Hall 定理 是匈牙利算法的基础 大意是说,对于一个二分图 左边的集合记为X,右边的集合记为Y 存在完美匹配,(即匹配数目=min(|X|,|Y|))的充分必要条件是 对于任意一个X的子集,设大小为k,那么和这个子集相连的Y必须不小于k个 这里有一个十分直观的证明 http://blog.csdn.net/werkeytom_ftd/article/details/65658944 [No Name Problem] 给出左右两边20个点的二分图以及一些边,每个点有点权 两边选出点集,要求可以…
传送门 题意: 现在有\(n\)堆石子,每堆石子有\(a_i\)个. 之后会有\(m\)次,每次选择\([l,r]\)的石子堆中的石子扔\(k\)个,若不足,则尽量扔. 现在输出\(1\)~\(m\)次,每次最多能取到多少石子(输出第\(i\)次的情况时,要考虑前\(i-1\)次). 给出的区间不存在包含关系. 思路: 稍微暴力点想就是一个二分图,将\(k_i\)拆在左边,然后石子在右边,每次最大匹配. 但这做法显然不可行,时间复杂度不能承受. 这种一般就考虑\(hall\)定理:假设前面都满足…
传送门 题意: 给出一个长度为\(L\)的环,标号从\(0\)到\(L-1\). 之后给出\(n\)个新郎,\(n\)个新娘离起点的距离. 现在新郎.新娘要一一配对,但显然每一对新人的产生都会走一定的距离\(d_i\),求所有\(d_i\)中最大值最小是多少. 思路: 显然最后的答案具有单调性,故可以二分答案之后来判定. 二分最大时间\(x\),那么只添加距离不超过\(x\)的边,做个最大匹配即可. 但因为\(n\)达到\(2e5\),显然匈牙利算法不可行. 考虑\(hall\)定理:若一个二分…
题意: 有 n 群怨灵排成一排,燐每秒钟会选择一段区间,消灭至多 k 只怨灵. 如果怨灵数量不足 k,则会消灭尽量多的怨灵. 燐作为一只有特点的猫,它选择的区间是不会相互包含的.它想要知道它每秒最多能消灭多少怨灵. 要求:在之前每次都消灭尽量多的怨灵的情况下,求第 i 秒最多能消灭的怨灵的数量. 首先,这题可以用网络流做部分分. 考虑如何判断是否可行: 有一种显然的二分图匹配:把每个询问放在X部,怨灵放在Y部. 然后,把询问,怨灵分别拆点,进行区间连边,做匹配,如果有完美匹配,则可行. 但是,如…
做这个题之前首先要了解判定二分图有没有完备匹配的Hall定理: 那么根据Hell定理,如果任何一个X子集都能连大于等于|S|的Y子集就可以获得完备匹配,那么就是: 题目变成只要不满足上面这个条件就能得到完备匹配,注意到右边的这个dk是一个常数,那么我们就可以只考虑左边最大的是否满足就行了. 那么我们就可以在修改过程中一边在线段树上修改一边查询区间最大值作比较就可以了. #include <bits/stdc++.h> using namespace std; ; typedef long lo…
Description 话说Nan在海边等人,预计还要等上M分钟.为了打发时间,他玩起了石子.Nan搬来了N堆石子,编号为1到N,每堆 包含Ai颗石子.每1分钟,Nan会在编号在\([L_i,R_i]\)之间的石堆中挑出任意Ki颗扔向大海(好疼的玩法),如果\([L_i,R_i]\)剩下石子不够\(K_i\)颗,则取尽量地多.为了保留扔石子的新鲜感,Nan保证任意两个区间\([L_i,R_i]\)和\([L_j,R_j]\),不会存在\(L_i<=L_j\& R_j<=R_i\)的情况…
LINK:Phoenix and Memory 这场比赛标题好评 都是以凤凰这个单词开头的 有凤来仪吧. 其实和Hall定理关系不大. 不过这个定理有的时候会由于 先简述一下. 对于一张二分图 左边集合为S 右边集合为T 那么有完备匹配时 最大匹配数为 min(|S|,|T|). 这里不妨假设|S|<=|T|. 若存在完备匹配那么对于任意集合\(s\in S\)都有s连出的边>=|s|. 这个定理是一张二分图具有完备匹配的充分必要条件. 先证明必要性:如果不存在 那么一定有点无法匹配到. 再证…
正题 题目链接:https://atcoder.jp/contests/arc106/tasks/arc106_e 题目大意 \(n\)个员工,第\(i\)个在\([1,A_i]\)工作,\([A_i+1,2\times A_{i}]\)休息,\([2\times A_i+1,3\times A_i]\)工作...以此类推. 然后每天可以为一个在工作的人发一枚奖牌,至少多少天才能让每个人都有\(k\)块奖牌. \(1\leq n\leq 18,1\leq k,A_i\leq 10^5\) 解题思…
正题 题目链接:https://www.luogu.com.cn/problem/AT4505 题目大意 给出\(n\)个点和\(n-1\)个点集\(U_i\),每个点集中选择两个点连边使得该图是一棵树.求方案. \(n\in[1,10^5],\sum_{i=1}^{n-1} |U_i|\in[1,2*10^5]\) 解题思路 冬令营上讲的题目,现在来写.(而且好像我记得课上讲的做法是\(bitset\)的,还是时间久了我记岔了?) 第一眼看上去直觉像是\(hall\)定理但还是不会. hall…
题面传送门 首先 \(b_i\) 的顺序肯定不会影响匹配,故我们可以直接将 \(b\) 数组从小到大排个序. 我们考虑分析一下什么样的长度为 \(m\) 的数组 \(a_1,a_2,\dots,a_m\) 能和 \(b\) 数组形成匹配.考虑对于 \(i,j\in [1,m]\),若 \(a_i+b_j\geq h\),就在 \(i,j\) 之间连边,那么形成的图必然是一张二分图,我们只需检验这张二分图是否存在完美匹配即可. 这时候就要用到一个叫做 Hall 定理的科技了.Hall 定理说的是这…
题面 给出一个长度为 n n n 的数列 { a i } \{a_i\} {ai​} 和一个长度为 m m m 的数列 { b i } \{b_i\} {bi​},求 { a i } \{a_i\} {ai​} 有多少个长度为 m m m 的连续子数列能与 { b i } \{b_i\} {bi​} 匹配. 两个数列可以匹配,当且仅当存在一种方案,使两个数列中的数可以两两配对,两个数可以配对当且仅当它们的和不小于 h h h. 1 ≤ m ≤ n ≤ 150000. 1\leq m\leq n\…
题目链接 首先Bi之间的大小关系没用,先对它排序,假设从小到大排 那么每个Ai所能匹配的Bi就是一个B[]的后缀 把一个B[]后缀的匹配看做一条边的覆盖,设Xi为Bi被覆盖的次数 容易想到 对于每个i∈[1,m]都要满足 Xi-i >= 0,即min{Xi-i}>=0 (Hall定理) 用线段树维护即可 感觉不需要霍尔定理也能看出来(因为就是显然吧..) //583ms 4140KiB #include <cstdio> #include <cctype> #inclu…
题意:给出一个长度为 n的数列 a和一个长度为 m 的数列 b,求 a有多少个长度为 m的连续子数列能与 b匹配.两个数列可以匹配,当且仅当存在一种方案,使两个数列中的数可以两两配对,两个数可以配对当且仅当它们的和不小于 h. 题解:先把b排序,要想能匹配,由hall定理,b的每个子集(大小为x)都至少有x条连向b,bi递增,和bi连的边也递增,那么当bi连边大于等于i时即可,所以当min(bi-i)>=0时满足条件 线性扫一遍即可,每个a二分b更新线段树即可 //#pragma GCC opt…
考虑当前合法的一个点集s,如果他合法,那么一定有一个完备匹配的点集包含这个点集,也就是两边都满足hall定理的话这两边拼起来的点集也满足要求 所以分别状压两边点集用hall定理转移判断当前点集是否合法,然后分别对两边点集的权值和排个序2point扫一下计算答案即可 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=2000005; int n,…