• 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
    

    一开始傻乎乎的用线段树写,写了写发现自己的线段树貌似比暴力还要慢,于是看了看题解发现原来跑一边扫描线就可以。。。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 using namespace std;
     7 const int MAXN=50001;
     8 struct node
     9 {
    10     int bg,ed;
    11 }a[MAXN];
    12 int n;
    13 int comp(const node & a,const node & b)
    14 {
    15     return a.bg<b.bg;
    16 }
    17 int main()
    18 {
    19     ios::sync_with_stdio(false);
    20     cin>>n;
    21     for(int i=1;i<=n;i++)
    22         cin>>a[i].bg>>a[i].ed;
    23     sort(a+1,a+n+1,comp);
    24     int l=a[1].bg;
    25     int r=a[1].ed;
    26     int now=1;
    27     while(now++&&now<=n)
    28     {
    29         if(a[now].bg>r)
    30         {
    31             printf("%d %d
    ",l,r);
    32             l=a[now].bg;
    33             r=a[now].ed;
    34         }
    35         r=max(a[now].ed,r);
    36     }
    37     printf("%d %d
    ",l,r);
    38     return 0;
    39 }
  • 相关阅读:
    Excel导入
    Git 操作命令
    java线程池
    jquery 初始化数据 添加html 第一次玩0.0
    设计模式六大原则之二:里氏替换原则
    升级指令
    strtok和strtok_r(转载)
    docker进阶之路-基础篇 | 二:portainer安装与基本使用
    docker进阶之路-基础篇 | 一:环境搭建
    集群式Quartz定时任务框架实践
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/7074223.html
Copyright © 2020-2023  润新知