校门外的树 数据加强版

原创 2012年08月08日 14:43:39

题目描述

某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。

马路上有一些区域要用来建地铁,这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。


输入格式

输入的第一行有两个整数L(1≤L≤10000)和 M(1≤M≤100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。


输出格式

输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。


样例输入

500 3

150 300

100 200

470 471


样例输出

298


时间限制/内存限制

1S / 128Mb


数据加强版就有点难了,我的算法很弱弱的,就是用了区间合并,但是可以不超时,代码如下:

#include <stdio.h>
struct qj
{
    int x,y;
};
struct qj a[600005];
int l,m,i,s,e,ans;
int com(struct qj c,struct qj b)
{
    if (c.x<b.x)
        return (1);
    if (c.x>b.x)
        return (-1);
    if (c.y<b.y)
        return (1);
    if (c.y>b.y)
        return (-1);
    return (0);
}

void qsort(int m,int n)
{
    int i,j;
    struct qj k,t;
    i=m;
    j=n;
    k=a[(i+j)/2];
    do
    {
        while (com(a[i],k)==1)
            i++;
        while (com(a[j],k)==-1)
            j--;
        if (i<=j)
        {
            t=a[i];
            a[i]=a[j];
            a[j]=t;
            i++;
            j--;
        }
    }
    while (i<=j);
    if (m<j)
        qsort(m,j);
    if (i<n)
        qsort(i,n);
}
int main()
{
    scanf("%d%d",&l,&m);
    for (i=1; i<=m; i++)
        scanf("%d%d",&a[i].x,&a[i].y);
    qsort(1,m);
    s=a[1].x;
    e=a[1].y;
    for (i=2; i<=m; i++)
    {
        if (a[i].x>e)
        {
            ans+=e-s+1;
            s=a[i].x;
            e=a[i].y;
            continue;
        }
        if ((a[i].x>=s)&&(a[i].y<=e))
            continue;
        if ((a[i].x>=s)&&(a[i].y>e))
            e=a[i].y;
    }
    ans+=e-s+1;
    ans=l-ans;
    printf("%d",ans+1);
    return 0;
}

校门外的树数据加强版

  • 2016年06月07日 13:29
  • 5.46MB
  • 下载

校门外有很多树

相当于求线段相交。 与[a,b]相交线段条数=总的线段条数-起点在[0, a-1]的线段条数-起点在[b+1, n]的线段条数。 #include #define maxn 50000 struct...
  • Formiko
  • Formiko
  • 2015-06-12 13:31:21
  • 547

校门外的树 走过看看

首先给大家介绍一种的暴力解法:把每一区间的树标记,这样就不会重复了,代码如下: #include void main() { int L, i, j, n; //L为区间的长度,n为区间的个数...
  • Jiang_youge
  • Jiang_youge
  • 2016-07-18 16:16:59
  • 159

校门外的树

某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。...
  • Skuart
  • Skuart
  • 2017-03-21 21:06:37
  • 213

校门外的树

#include #include #include using namespace std; int main() {     int l,m;     scanf("%d%d",&l,&m);  ...
  • qq_37654726
  • qq_37654726
  • 2017-03-04 10:43:25
  • 179

BZOJ 3226 [SDOI2008]校门外的区间

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3226题意: 给定一个空集合S,维护五种集合与集合的操作,将最终得到的集合输出。 对于集合S...
  • skywalkert
  • skywalkert
  • 2015-02-27 16:31:05
  • 1545

校门外的树(线段树写法)

额,今天写一遍校门外的树线段树写法,纯属无聊。 乱写的,根本没有任何优化,速度还满了一点点。 也就是直接从模板上修改的,没有点统计,所以说,看看就好,知道线段树这中鬼东东就好。 额 我用的都是...
  • cnyali_ljf
  • cnyali_ljf
  • 2016-07-15 14:01:31
  • 1919

【SDOI2008】【BZOJ3226】校门外的区间

Description  受校门外的树这道经典问题的启发,A君根据基本的离散数学的知识,抽象出5种运算维护集合S(S初始为空)并最终输出S。现在,请你完成这道校门外的树之难度增强版——校门外的区间。 ...
  • CreationAugust
  • CreationAugust
  • 2015-10-26 09:34:46
  • 1500

BZOJ-3226 校门外的区间 线段数+拆点(类似的思想)

shabi题....bzoj关键字检查freopen??可怕,,1A的卡了一小时.... 3226: [Sdoi2008]校门外的区间 Time Limit: 10 Sec Memory Limi...
  • DaD3zZ
  • DaD3zZ
  • 2016-02-28 20:13:15
  • 386

06:校门外的树

原题链接 总时间限制: 1000ms 内存限制: 65536kB 描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的...
  • mayuan2017
  • mayuan2017
  • 2017-09-10 20:42:56
  • 648
收藏助手
不良信息举报
您举报文章:校门外的树 数据加强版
举报原因:
原因补充:

(最多只允许输入30个字)