给定 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
//区间dp 和清华复试题 剩余的树 一样的做法
#include <stdio.h>
#define max(a,b) ((a)>(b)?(a):(b))
void quicksort(int a[],int b[],int lo,int hi);
int main(){
int n,i;
scanf("%d",&n);
int a[n],b[n],cnt=1,r; //区间初始化为1个
for(i=0;i<n;i++) scanf("%d %d",&a[i],&b[i]); //存储每个区间的左右端点
quicksort(a,b,0,n); //按左端点排序
r=b[0]; //初始化最右侧端点
for(i=1;i<n;i++){ //从第二个区间开始
if(a[i]>r){ //本区间与之前的区间 无交集
cnt++; //区间数+1
r=b[i]; //更新最右侧端点
}
else r=max(r,b[i]); //本区间与之前的区间 有交集 看看r是否要更新
}
printf("%d",cnt);
return 0;
}
void quicksort(int a[],int b[],int lo,int hi){
int n=hi-lo,i=lo,j=hi-1;
if(n<=1) return;
else{
int t=a[lo],p=b[lo];
while(i<j){
while(i<j && a[j]>t) j--;
if(i<j){
a[i]=a[j];
b[i++]=b[j];
}
while(i<j && a[i]<t) i++;
if(i<j){
a[j]=a[i];
b[j--]=b[i];
}
}
a[i]=t;
b[i]=p;
quicksort(a,b,lo,i);
quicksort(a,b,i+1,hi);
}
}