校门外的树 数据加强版

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

Vijos 1448校门外的树(线段树)

传送门:https://vijos.org/p/1448 题意:查询一个区间内被修改的次数。 思路:线段树单点更新,区间查询。 利用括号序列的方法,更新区间[a,b]时,点a记录左括号数,点b记...
  • rachelsg
  • rachelsg
  • 2016年05月25日 17:53
  • 471

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

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

1154: 校门外的树

1154: 校门外的树 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1928  Solved: 950 SubmitStatusWeb Boar...
  • sd_DENG
  • sd_DENG
  • 2017年07月14日 09:09
  • 215

【noip2005】校门外的树

【noip2005】校门外的树 描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;...
  • Clove_unique
  • Clove_unique
  • 2015年10月29日 18:40
  • 869

蓝桥杯 ALGO-29 算法训练 校门外的树(区间处理)

问题描述   某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数 轴上的每个整数点,即0,1,2,…...
  • liuchuo
  • liuchuo
  • 2016年07月22日 00:17
  • 400

poj 2808题校门外的树(java)

先写上代码,用java写的:import java.util.*;import java.io.*;public class Main { public static void main(String...
  • greyfreedom
  • greyfreedom
  • 2011年05月04日 13:30
  • 632

百炼POJ 2808 校门外的树

分析 这个问题可以概括为输入一个大的整数闭区间,及一些可能相互重叠的在该大区间内的小的整数闭区间。在大的整数闭区间内去除这些小的整数闭区间,问之后剩下的可能不连续的整数区间内有多少个整数。 ...
  • u012999474
  • u012999474
  • 2013年11月30日 05:01
  • 1035

openjudge 校门外的树3

P1473 校门外的树3 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述  校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补...
  • clover_hxy
  • clover_hxy
  • 2016年01月11日 19:53
  • 716

vijos 1448 校门外的树 - 树状数组

请自行搜索 题目大意:维护n个位置,支持新建一段区间,查询某一段区间与已加入的多少区间有交。 题解: 神题啊 假设询问区间为[s,t],那么区间[a,b]与[s,t]相交,必要条件是a 因此...
  • Mys_C_K
  • Mys_C_K
  • 2017年06月26日 19:57
  • 212

水题解题报告01---校门外的树(POJ原2808)

此题是POJ原2808题,目前似乎已经被更换 问题描述 某校大门外长度为 L 的马路上有一排树,每两棵相邻的树之间的间隔都是 1 米。我们 可以把马路看成一个数轴,马路的一端在数轴 0 的位置,另...
  • yxnot
  • yxnot
  • 2017年01月19日 01:40
  • 419
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:校门外的树 数据加强版
举报原因:
原因补充:

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