思路:
(1)按照左端点排序
(2)维护一个st与ed
(3)如果新区间l<=ed即与旧区间相交2,那么就更新ed,反之则不相交,则更新st和ed
(4)收尾:无论最后一个是相交区间还是非相交区间,最后一个区间都没法放进res里面,所以要最后再补放进去。
(5)注意对于一个区间都没有的情况进行特判。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
vector<PII> segs;
int main()
{
int n;
cin >> n;
for(int i = 0;i < n;i ++)
{
int l,r;
cin >>l >> r;
segs.push_back({l,r});
}
sort(segs.begin(),segs.end());
// if(segs.size() == 0)
// {
// cout << 0 << endl;
// return 0;
// }
// vector<PII> res;
// int st = segs[0].first,ed = segs[0].second;
// for(auto item: segs)
// {
// int l = item.first;
// int r = item.second;
// if(l <= ed) ed = max(ed,r);
// else
// {
// res.push_back({st,ed});
// st = l;
// ed = r;
// }
// }
// if (st != -2e9) res.push_back({st, ed}); //收尾
// cout << res.size() <<endl;
// return 0;
vector<PII> res;
int st = -2e9,ed = -2e9;
for(auto item : segs)
{
int l = item.first;
int r = item.second;
if(l > ed)
{
if(st != -2e9)
{
res.push_back({st,ed});
st = l;
ed = r;
}
else
{
st = l;
ed = r;
}
}
else
{
ed = max(ed,r);
}
}
if (st != -2e9) res.push_back({st, ed}); //收尾
cout << res.size()<< endl;
return 0;
}