题目描述
给定 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
C++ 代码
#include<iostream>
#include<cstdio>
#include<utility>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 2e9;
typedef pair<int, int> PII;
vector<PII>nums, res;
int ans,kase=1;
int main()
{
int ed = -2e9, st = -2e9;
int n;
scanf("%d", &n);
while (n--) {
int l, r;
scanf("%d%d", &l, &r);
nums.push_back({ l,r }); //将各区间端点放入数组
}
sort(nums.begin(), nums.end()); //对区间首端点排序
st = nums[0].first, ed = nums[0].second; //初始化st(合并区间的首端点),ed(合并区间的末端点)
for (auto num : nums) {
if (num.first <= ed) { //如果下一个小区间的首端点小于等于已合并区间的末端点,将它并入已合并区间
if (num.second > ed) ed = num.second;//更新末端点
}
else {
ans++; //无法并入,则合并完一个区间;
st = num.first; //更新首端点和末端点
ed = num.second;
}
}
ans++; //最后一个合并区间没有进行上面的else而循环已结束,要加上!
printf("%d", ans);
return 0;
}
tql