注意到这个模型可以转化成二分图
根据霍尔定理,对于任意
S∈U
,都要满足
S≥N(S)
,其中
U
是全集,
因为
#include <cstdio>
#include <iostream>
#include <algorithm>
#define fi first
#define se second
using namespace std;
const int N=500010;
typedef pair<int,int> par;
int n,m,add[N<<2],mx[N<<2];
par p[N];
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline void rea(int &x){
char c=nc(); x=0;
for(;c>'9'||c<'0';c=nc());for(;c>='0'&&c<='9';x=x*10+c-'0',c=nc());
}
inline void mark(int g,int x){
add[g]+=x; mx[g]+=x;
}
inline void Push(int g){
if(add[g]==0) return ;
mark(g<<1,add[g]); mark(g<<1|1,add[g]); add[g]=0;
}
inline void Up(int g){
mx[g]=max(mx[g<<1],mx[g<<1|1]);
}
void Build(int g,int l,int r){
if(l==r) return void(mx[g]=-m+r-1);
Build(g<<1,l,l+r>>1); Build(g<<1|1,(l+r>>1)+1,r);
Up(g);
}
void Add(int g,int l,int r,int L,int R,int x=1){
if(l==L&&r==R) return mark(g,x);
int mid=L+R>>1; Push(g);
if(r<=mid) Add(g<<1,l,r,L,mid,x);
else if(l>mid) Add(g<<1|1,l,r,mid+1,R,x);
else Add(g<<1,l,mid,L,mid,x),Add(g<<1|1,mid+1,r,mid+1,R,x);
Up(g);
}
int Query(int g,int l,int r,int L,int R){
if(l==L&&r==R) return mx[g];
int mid=L+R>>1; Push(g);
if(r<=mid) return Query(g<<1,l,r,L,mid);
if(l>mid) return Query(g<<1|1,l,r,mid+1,R);
return max(Query(g<<1,l,mid,L,mid),Query(g<<1|1,mid+1,r,mid+1,R));
}
int main(){
rea(n); rea(m); Build(1,1,m+1);
for(int i=1;i<=n;i++){
rea(p[i].fi),rea(p[i].se);
}
sort(p+1,p+1+n); int q=1,ans=0;
for(int i=0;i<=m;i++){
while(q<=n&&p[q].fi<=i){
Add(1,1,p[q].se,1,m+1,1);
q++;
}
ans=max(ans,Query(1,i+1,m+1,1,m+1)-i);
}
printf("%d\n",max(ans,n-m));
return 0;
}