/*
Acwing 906.区间分组
给定 N 个闭区间 [ai,bi],请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。
输出最小组数。
输入格式:
第一行包含整数 N,表示区间数。
接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。
输出格式
输出一个整数,表示最小组数。
数据范围:
1≤N≤105,
?109≤ai≤bi≤109
输入样例:
3
-1 1
2 4
3 5
输出样例:
2
应用:有若干个活动,第i个活动开始时间和结束时间是[SiSi,fifi],同一个教室安排的活动之间不能交叠,求要安排所有活动,少需要几个教室?
思路:1.将所有区间按照左端点从小到大排序
2.用小根堆维护每一个不相交区间的右端点的最大值
3.若区间之间有交集,那么增加一个新的教室
*/
#include<bits/stdc++.h>
using namespace std;
int n;
struct SS{
int l,r;
}e[100010];
bool cmp(SS x,SS y)
{
return x.l<y.l;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int x,y;
cin>>x>>y;
e[i]={x,y};
}
sort(e+1,e+1+n,cmp);
//用小根堆来维护所有组右端点的最大值
//堆中每一个值存的是每个组的右端点的最大值
priority_queue<int,vector<int>,greater<int>>heap;
for(int i=1;i<=n;i++)
{
auto t=e[i];
//若堆为空或者堆顶元素 >= 现在区间左端点,说明有交集,不能合并
if(heap.empty()||heap.top()>=t.l) heap.push(t.r);
else
{
//更新当前区间的右端点
heap.pop();
heap.push(t.r);
}
}
//输出组数
cout<<heap.size();
return 0;
}