• 洛谷P1047 校门外的树


    P1047 校门外的树

    题目描述

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

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

    输入输出格式

    输入格式:

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

    输出格式:

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

    输入输出样例

    输入样例#1:
    500 3
    150 300
    100 200
    470 471
    
    输出样例#1:
    298

    说明

    NOIP2005普及组第二题

    对于20%的数据,区域之间没有重合的部分;

    对于其它的数据,区域之间有重合的情况。

    /*并查集*/
    #include <iostream>
    #include <cstdio>
    using namespace std;
    int r[100000],f[100000];
    int find(int x){
        return f[x]==x?x:f[x]=find(f[x]);
    }
    void uniom(int u,int p){
        int x=find(u),y=find(p);
        if(x==y) return ;
        f[x]=y;
    }
    int main(){
        int n,m,sum=0,a,b;
        cin>>n>>m;
        for(int i=0;i<=n;i++)
        f[i]=i;
        while(m--){
            cin>>a>>b;
            for(int i=a;i<=b;i++)
            uniom(i,i+1);
        }
        for(int i=0;i<=n;i++)
        if(i==f[i]) sum++;
        cout<<sum<<endl;
    }
  • 相关阅读:
    剑指Offer 07 重建二叉树
    剑指Offer 06 从尾到头打印链表
    剑指Offer 05 替换空格
    剑指Offer 04 二维数组中的查找
    剑指Offer 03 数组中重复的数字
    leetcode518
    leetcode474
    leetcode376
    leetcode646
    leetcode213
  • 原文地址:https://www.cnblogs.com/thmyl/p/7622238.html
Copyright © 2020-2023  润新知