区间合并
分为如下三种情况
步骤:
-
首先需要对区间的左端点进行排序,有利于合并(直接遍历区间与上一个区间比较即可)。
-
遍历区间,对不同的情况进行不同分析
具体实现
用pair
存储区间左右端点
两个vector
存储合并前和合并后的所有区间
注意设置起始的左右端点为无穷大
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
const int N = 100010;
void merge(vector<PII> &segs)
{
vector<PII> res;
//排序
sort(segs.begin(), segs.end());
//起始值
int st = -2e9, ed = -2e9;
//遍历每个区间
for(auto seg : segs)
{
if(seg.first > ed) //当该区间左端点大于上一个区间的右端点,表明此时无法合并区间,需要将上一个区间存入结果vector,并更新维护区间。
{
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()
{
vector<PII> segs;
int n;
cin >> n;
while(n--)
{
int l, r;
cin >> l >> r;
segs.push_back({l, r});
}
merge(segs);
cout << segs.size() << endl;
return 0;
}