AcWing 模板题 - 803 区间和并

给定 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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值