给定 N 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。
输出选择的点的最小数量。
位于区间端点上的点也算作区间内。
输入格式
第一行包含整数 N,表示区间数。
接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。
输出格式
输出一个整数,表示所需的点的最小数量。
数据范围
1≤N≤105,
−109≤ai≤bi≤109
输入样例:
3
-1 1
2 4
3 5
输出样例:
2
_____________________________________________________________________________
用R,L记录当前重叠线段的左右端点;
分析:排完序后面对后面的线段只有3种情况:
——————————
1. ——————更新左右端点
2. ——————————更新左端点
3. ————————————需要增加一个点更新R,L;
写作不易,点个赞呗!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
_____________________________________________________________________________
#include <bits/stdc++.h>
using namespace std;
struct node{
int l,r;
}a[1000005];
bool cmp(node a,node b){
return a.l<b.l;
}
int n,ans=1,m;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].l>>a[i].r;
}
sort(a+1,a+1+n,cmp);
int L=a[1].l,R=a[1].r;
for(int i=2;i<=n;i++){
if(a[i].l>=L&&a[i].l<=R&&a[i].r<=R){判断否否属于情况1 注:必须有等于情况
L=a[i].l;
R=a[i].r;
}
else if(a[i].l>=L&&a[i].l<=R&&a[i].r>=R){判断否否属于情况2 注:必须有等于情况
L=a[i].l;
}
else if(a[i].l>R){判断否否属于情况3
ans++;
L=a[i].l;
R=a[i].r;
}
}
cout<<ans;
}