关闭

校门外的树 数据加强版

标签: struct算法任务c
604人阅读 评论(0) 收藏 举报
分类:

题目描述

某校大门外长度为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;
}

0
0

猜你在找
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:46746次
    • 积分:805
    • 等级:
    • 排名:千里之外
    • 原创:35篇
    • 转载:1篇
    • 译文:1篇
    • 评论:22条
    最新评论