给定 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<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll>PII;
vector<PII>A,B;
int main()
{
ll n;
cin>>n;
for(ll i=0;i<n;i++)
{
ll l,r;
cin>>l>>r;
A.push_back({l,r});
}
ll be=-2e9,ed=-2e9;
sort(A.begin(),A.end());
for(auto it:A) //分三种情况
{
if(ed<it.first) // 1:维护区间的右端点小于下一区间的左端点
{ //说明两区间不能合并;
if(be!=-2e9)B.push_back({be,ed}); //可把be和ed更新为第一个区间;
be=it.first;ed=it.second; //更新维护区间;
}
else if(ed<it.second)ed=it.second; //2:维护区间右端点大于等于下一区间左端点合并两区间;
//3:隐藏的情况,维护区间可完全覆盖下一区间;
}
B.push_back({be,ed}); // 将最后维护完成的区间加入;
A=B;
cout<<A.size();
}