排序,贪心 一开始考虑简单了,没考虑到比如下面这种情况
!----
! –
! ------
修改:用last记住前i项能达到的最右端的位置。这个不能套到另一层循环里,会超时!提前处理好就可以了。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#define inf 1e9
using namespace std;
typedef pair<int,int> PII;
const int N=1e5+10;
int last[N];//last[i]存前i段区间能达到的最右端的值(排序后)
vector<PII> section;
int n;
int main()
{
cin>>n;
for(int i=0;i<n;i++){
int l,r;
cin>>l>>r;
section.push_back({l,r});
}
sort(section.begin(),section.end());
//for(int i=0;i<n;i++)cout<<section[i].first<<" "<<section[i].second<<"\n";
int min=-inf;
for(int i=0;i<n;i++){
if(section[i].second>min)min=section[i].second;
last[i]=min;
}
//for(int i=0;i<n;i++)cout<<last[i]<<"!\n";
int res=1;
for(int i=1;i<n;i++){
if(section[i].first>last[i-1])res++;
}
cout<<res<<"\n";
return 0;
}