主要是先对区间排序,然后判断有无相交,有就更新端点,无就做记录。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N=3e5+10;
int n,m;
int a[N],s[N];
vector<int>alls;
typedef pair<int,int> PII;
vector<PII> add,q;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int n;
cin>>n;
int st=-2e9,ed=-2e9 ;
for(int i=0;i<n;i++)
{
int l,r;
cin>>l>>r;
add.push_back({l,r});//插入所有的左右端点
}
sort(add.begin(),add.end()); // 按左端点排序
for(auto i:add)
{
if(ed<i.first)//区间尾节点小于 另一区间首节点 即 区间不相交
{
if(ed!=-2e9) q.push_back({st,ed});
st=i.first;ed=i.second;
}
else
{
ed=max(ed,i.second);//更新尾节点
}
}
if(ed!=-2e9) q.push_back({st,ed});//遍历完后并且有插入就把区间放入q
cout<<q.size();
}