给定 nn 个区间 [lili,riri],要求合并所有有交集的区间。
注意如果在端点处相交,也算有交集。
输出合并完成后的区间个数。
例如:[11,33] 和 [22,66] 可以合并为一个区间 [11,66] 。
输入格式
第一行包含整数nn。接下来nn行,每行包含两个整数ll和rr。
输出格式
共一行,包含一个整数,表示合并区间完成后的区间个数。数据范围
1≤n≤1000001≤n≤1000001≤n≤1000001≤n≤100000,
−109≤li≤ri≤109−109≤li≤ri≤109
样例
输入样例:5
1 2
2 4
5 6
7 8
7 9
输出样例:3
作者:lixiaoqian
链接:https://www.acwing.com/solution/content/2615/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
关键 : 先排序, 按first顺序进行区间维护
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair<int, int> pii;
vector<pii> nums, res;
int mian()
{
int st = -2e9, ed = -2e9; ed 代表区间结尾,st代表区间的开头
int n;
cin >> n;
while(n--) 先读入所有区间
{
int l, r;
cin >> l >> r;
nums.push_back({l,r});
}
sort(nums.begin(), nums.end()); 默认按first排序
for(auto num : nums)
{
if(ed < num.first) 情况 1 : 两个区间无法合并
{
if(ed != -2e9) res.push_back({st,ed}); 把区间1放进答案里
st = num.first,ed = num.second; 开始维护区间2
}
else if(ed < num.second) 情况 2 :可以合并,包含或相交
ed = num.second; 取最远的结尾
}
if(st != -2e9 && ed != -2e9) res.push_back({st,ed}); 考虑最后一个区间
printf("%d",res.size());
return 0;
}