校门外的树 数据加强版

原创 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;
}

相关文章推荐

一位ACMer过来人的心得 POJ测试数据合集

转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6642573     最近AC题:2528   更新时间:201...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

bitset+暴力——校门外的树(增强版)

bitset大法好! 洛谷的数据水我会说吗?! 纯模拟就好了:) g[i]记录经过包括挖和种的操作后i位置的状态(是否有树) k[i]记录经过挖操作后i位置的状态 g.count()为剩下的包括树苗和...

例题:校门外的树

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

校门外的树数据加强版

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

【离散化扫描】 校门外的树{加强版}

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

校门外的树加强版

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

HDU 5828 多校第八场 1008 Rikka with Sequence(线段树--数据加强版)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5828题意:三种操作,一种是区间增加,一种是区间开方,一种是区间求和。原思路(数据已加强,这个方法已经过不...
  • xtttgo
  • xtttgo
  • 2016年08月11日 17:26
  • 1017

BZOJ 2594: [Wc2006]水管局长数据加强版(LCT+最小生成树+离线)

题目戳我Solution题目大意:就是让你维护一棵动态的最小生成树, 并询问两点路径中边权最大值。很明显,用LCT来做这个。有几个关键点: ①删边维护mst不好搞,我们离线然后删边变加边。 ②一开...
  • Ab_Ever
  • Ab_Ever
  • 2017年06月29日 15:07
  • 194

[动态树 LCT] BZOJ 2594 [Wc2006]水管局长数据加强版

动态树模板题 最开始加边用Kruskal比较快,不用LCT,然后再用LCT维护最小生成树 话说这道题小数据范围的正解是什么.... PS:以前LCT的求根都是打错的,没有pushdown() #i...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:校门外的树 数据加强版
举报原因:
原因补充:

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