给定 n 个区间 [li,ri],要求合并所有有交集的区间。
注意如果在端点处相交,也算有交集。
输出合并完成后的区间个数。
例如:[1,3]和 [2,6] 可以合并为一个区间 [1,6]
输入格式
第一行包含整数 n。
接下来 n行,每行包含两个整数 l 和 r。
输出格式
共一行,包含一个整数,表示合并区间完成后的区间个数。
数据范围
1≤n≤100000
−109≤li≤ri≤109
输入样例:
5
1 2
2 4
5 6
7 8
7 9
输出样例:
3
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef pair<int,int> PII;
const int N =100010;
int n;
vector<PII> segs;
//区间合并
void merge(vector<PII> &segs)
{
vector<PII> res;//合并之后的结果
sort(segs.begin(),segs.end());//所有区间排序
int st=-2e9,ed=-2e9;//设置边界值
for(auto seg : segs)//从前往后扫描所有线段
if(ed<seg.first)//维护的区间与另一个区间严格没有交集
{
if(st!=-2e9) res.push_back({st,ed});
st=seg.first,ed=seg.second;
}
else ed=max(ed,seg.second);//有交点,将区间更新
if(st!=-2e9) res.push_back({st,ed});//将最有一个区间也加入
segs=res;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++) //将所有区间拿进来
{
int l,r;
cin >>l>>r;
segs.push_back({l,r});//读入左右端点
}
merge(segs);//区间合并
cout<<segs.size()<<endl;//返回合并之后的区间长度
return 0;
}