问题:输入N个区间,把所有有交集的区间进行合并,最后输出合并后的区间个数
如 (1,2) (2,4)(5,6)(7,8)(7,9)
得 (1,4) (5,6)(7,9)
1)按区间左端点排序。
2)维护区间(start,end)
对于新区间 (start1,start2)
case1: start1>start end1<end 包含关系,跳过
case2: start1>start end1>end 更新end end=end1
case3:start1>end 更新维护区间 end=end1 start=start1
#include<cstdio>
#include<vector>
#include<iostream>
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());
//st,ed是维护坐标
int st=-2e9,ed=-2e9;
//遍历所有的坐标
for(auto seg:segs) {
//如果该点的开始坐标比维护坐标大 case3
if (ed < seg.first) {
//如果不是初始化坐标,那么押入
if (st != -2e9) res.push_back({st, ed});
//更新维护区间
st = seg.first, ed = seg.second;
}
//否则case1,2
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;
}