问题描述
给定 n个区间 [li,ri],要求合并所有有交集的区间。
注意如果在端点处相交,也算有交集。
输出合并完成后的区间个数。
例如:[1,3]和 [2,6]可以合并为一个区间 [1,6]。
输入格式
第一行包含整数 n。
接下来 n行,每行包含两个整数 l和 r。
输出格式
共一行,包含一个整数,表示合并区间完成后的区间个数。
问题求解
先把输入的区间对排序,然后再维护一个区间,与后面一个个区间进行三种情况的比较,存储到数组里去。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int n;
cin>>n;
int l,r;
vector<pair<int, int>> q;
vector<pair<int, int>> res;
int i;
for(i =0; i<n; i++){
cin>>l>>r;
q.push_back({l,r});
}
sort(q.begin(), q.end());
l = -2e9;
r = -2e9;
for(auto item : q){
if(item.first > r){
//区间1与区间2不能合并
if(r!=-2e9){res.push_back({l,r});}
l = item.first;
r = item.second;
}
else if(item.second > r){
//区间1和区间2有交集,但不是包含关系
r = item.second;
}
//区间1 包含 区间 2 不做处理,进入下一次迭代
}
//排序后的区间不会出现区间2包括区间1
res.push_back({l,r});
cout<<res.size();
}