区间合并
给定 nn 个区间 [li,ri][li,ri],要求合并所有有交集的区间。
注意如果在端点处相交,也算有交集。
输出合并完成后的区间个数。
例如:[1,3][1,3] 和 [2,6][2,6] 可以合并为一个区间 [1,6][1,6]。
输入格式
第一行包含整数 nn。
接下来 nn 行,每行包含两个整数 ll 和 rr。
输出格式
共一行,包含一个整数,表示合并区间完成后的区间个数。
数据范围
1≤n≤1000001≤n≤100000,
−109≤li≤ri≤109−109≤li≤ri≤109
输入样例:
5
1 2
2 4
5 6
7 8
7 9
输出样例:
3
/*
思路:把一个个区间加入一个vector 然后求出这个vector的长度即可
1、把两个端点用一个pair来存储然后存入vector
2、以左端点来排序这个vector
3、判断进入比较的区间的左端点是否大于现在维护的区间的右端点如果是就把现在维护的区间加入vector然后更新左右端点值
如果没有大于就比较维护的区间的右端点值和进入比较的区间的右端点值谁大来更新右端点值
*/
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
typedef pair<int,int>PII;
vector<PII>res;
void mer_sort(vector<PII> &res)
{
int st = -2e9,ed = -2e9;
vector<PII>temp;
sort(res.begin(),res.end());
for(auto item:res)
if(ed < item.first)
{
if(st != -2e9)
temp.push_back({st,ed});
ed = item.second;
st = item.first;
}else
ed = max(ed,item.second);
if(st != -2e9)temp.push_back({st,ed});//空区间的情况
res = temp;
}
int main()
{
int n;
cin>>n;
for(int i = 0;i<n;i++)
{
int l ,r;
cin>>l>>r;
res.push_back({l,r});
}
mer_sort(res);
cout<<res.size()<<endl;
}