题意:地上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) {