[AtCoder ARC076 .F] [二分图] [霍尔定理] Exhausted?

题意:地上1到m个位置摆上椅子,有n个人要就座,每个人都有座位癖好:选择位置小于等于L或者大于等于R的位置。问至少需要添加多少个椅子能让所有人坐满。

解法:显然将一个人和他能坐的所有椅子连边,形成一个二分图,若椅子不够,即使存在完美匹配,也不能使所有人就坐,故椅子数至少要为n,答案初始化 max(0,n-m)。

当椅子数大于等于人数时,存在完美匹配代表每个人都能就座,由霍尔定理,要存在完美匹配的话,得满足对任意一个“人的集合 S”,其连边的“椅子集合 T”,| T | >= | S |,则答案就是所有的 | S | - | T | 的最大值,因为只要在右边无穷远或者左边无穷远加椅子,所有人都能就座,易得可以使霍尔定理满足。

如何处理 max ( | S | - | T | ) 呢?可以枚举椅子集合T的L与R,求满足条件的最大人数,即满足 l<=L || r>=R的最大人数,l, r为人的喜好的左右两端点。将每个人是为平面中的点(l, r),则要求的就是对给定点 (L, R),所有人扣掉以 (L, R)为原点,第四象限的人数。这个可以用扫描线处理。

#include <bits/stdc++.h>
using namespace std;
const int maxn=200005;
const int inf=0x3f3f3f3f;
int n,m,l,r;
vector<int> v[maxn];
struct node {
    int l,r,lz,mmax;
    inline void update(int v) {
     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值