• P2434 [SDOI2005]区间


    题目描述

    现给定n个闭区间[ai, bi],1<=i<=n。这些区间的并可以表示为一些不相交的闭区间的并。你的任务就是在这些表示方式中找出包含最少区间的方案。你的输出应该按照区间的升序排列。这里如果说两个区间[a, b]和[c, d]是按照升序排列的,那么我们有a<=b<c<=d。

    请写一个程序:

    读入这些区间;

    计算满足给定条件的不相交闭区间;

    把这些区间按照升序输出。

    输入输出格式

    输入格式:

    第一行包含一个整数n,3<=n<=50000,为区间的数目。以下n行为对区间的描述,第i行为对第i个区间的描述,为两个整数1<=ai<bi<=1000000,表示一个区间[ai, bi]。

    输出格式:

    输出计算出来的不相交的区间。每一行都是对一个区间的描述,包括两个用空格分开的整数,为区间的上下界。你应该把区间按照升序排序。

    输入输出样例

    输入样例#1: 
    5
    5 6
    1 4
    10 10
    6 9
    8 10
    
    输出样例#1: 
    1 4
    5 10
    

    Solution:

      本题较水,直接贪心。。。

      题意等价于区间求全集(即所有区间的并集),开两个桶维护区间左端点和区间右端点(大小$10^6$)。

      然后从前往后扫贪心输出,每次扫到一个区间左边界存在且当前区间出现次数为$0$则输出该左边界,而每次扫到一个区间右边界时当前区间出现次数减$1$若区间出现次数为$0$了输出该右区间就好了。

    代码:

    #include<bits/stdc++.h>
    #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
    #define il inline
    using namespace std;
    il int gi(){
        int a=0;char x=getchar();
        while(x<'0'||x>'9')x=getchar();
        while(x>='0'&&x<='9')a=(a<<3)+(a<<1)+x-48,x=getchar();
        return a;
    }
    int n,x[1000001],y[1000001],s;
    int main(){
        n=gi();
        while(n--)x[gi()]++,y[gi()]++;
        For(i,1,1000000){
            if(!s&&x[i])printf("%d ",i);
            s+=x[i]-y[i];
            if(!s&&y[i])printf("%d
    ",i);
        }
        return 0;
    }
  • 相关阅读:
    第3次实践作业
    第2次实践作业
    第09组 团队Git现场编程实战
    第二次结对编程作业
    团队项目-需求分析报告
    团队项目-选题报告
    第一次结对编程作业
    第一次个人编程作业
    第一次博客作业
    课程设计第十四天
  • 原文地址:https://www.cnblogs.com/five20/p/9066926.html
Copyright © 2020-2023  润新知