题目描述
给定 n 个区间 [li,ri],要求合并所有有交集的区间。
注意如果在端点处相交,也算有交集。
输出合并完成后的区间个数。
例如:[1,3]和[2,6]可以合并为一个区间[1,6]。
输入格式
第一行包含整数n。
接下来n行,每行包含两个整数 l 和 r。
输出格式
共一行,包含一个整数,表示合并区间完成后的区间个数。
样例
输入样例:
5
1 2
2 4
5 6
7 8
7 9
输出样例:
3
思路:排序后把每个端点扫一遍过去即可
开一个结构体表示一个点,x表示横坐标,isLeft标识是否是左端点。
然后排序,横坐标小的靠左,相等的情况下是左端点的点靠左。
遍历点数组,用sum代表当前处于几个区间中,若当前点是左端点则sum+1,否则sum-1,sum == 0时,代表已经出了当前区间(合并后的区间)。当sum==0时,ans++,最后ans就是答案
C++ 代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct point{
ll x, isLeft;
bool operator < (point a){
if(x < a.x) return true;
else if(x == a.x) return isLeft > a.isLeft;
return false;
}
};
point p[200010];
int n;
int main(){
ll x, top = 0;
cin >> n;
for(int i = 0; i < n; ++i){
cin >> x; p[top++] = point{x, true};
cin >> x; p[top++] = point{x, false};
}
sort(p, p + top);
int sum = 0, ans = 0;
for(int i = 0; i < top; ++i){
if(p[i].isLeft)
sum++;
else
sum--;
if(!sum)
ans++;
}
cout << ans << endl;
return 0;
}