对右端点排序,则从左往右扫描,看右端点经过几个区间。
对左端点排序,则从右往左扫描,看左端点经过几个区间。
类似双指针的思想,来进行优化
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> pii;
const int N = 1e5 + 10;
pii a[N];
bool st[N];
int n;
bool cmp(pii a, pii b){
return a.y <= b.y;
}
int main(){
scanf("%d",&n);
for(int i = 0; i < n; i++){
cin >> a[i].x >> a[i].y;
}
sort(a,a + n,cmp);
// for(int i = 0; i < n; i++){
// cout << a[i].x <<" " << a[i].y << endl;
// }
int ans = n;
st[0] = true;
for(int i = 0, j = 0; i < n - 1; i++){
j = i;
while(j < n - 1 && a[i].y >= a[j + 1].x && !st[j + 1]){//当i区间的右端点经过j+1的区间时,不停的pass(j+1)这个区间
// cout <<"i = " << i <<"j = " << j << endl;
ans--;
st[j + 1] = true;
j++;
}
//当i区间和j+1区间没有交集时,将i区间定位为j这个区间,重复这个过程,直到结束。
i = j;//关键一步,若无,则只能过一个点
}
cout << ans << endl;
return 0;
}