zoukankan      html  css  js  c++  java
  • 蓝桥杯 校门外面的树 (线段树,区间处理)

    问题描述
      某校大门外长度为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
    数据规模和约定
      对于20%的数据,区域之间没有重合的部分;
      对于其它的数据,区域之间有重合的情况。
     
    挺基础的一道线段树的题目,直接附上我的ac代码:
     1 #include<iostream>
     2 using namespace std;
     3 struct node{
     4     int l,r,w;
     5 }tree[50050];
     6 void create(int i,int left,int right){
     7     tree[i].l=left;tree[i].r=right;
     8     if(left==right){
     9         tree[i].w=1;
    10         return;
    11     }
    12     int mid=(left+right)>>1;
    13     create(i<<1,left,mid);
    14     create((i<<1)|1,mid+1,right);
    15     tree[i].w=tree[i<<1].w+tree[(i<<1)|1].w;
    16 }
    17 void update(int i,int left,int right){
    18     if(tree[i].l==tree[i].r){
    19         tree[i].w=0;return;
    20     }
    21     if(tree[i].l==left&&tree[i].r==right){
    22         tree[i].w=0;return;
    23     }
    24     if(tree[i].w==0) return;
    25     int mid=(tree[i].l+tree[i].r)>>1;
    26     if(right<=mid){
    27         update(i<<1,left,right);
    28     }else if(left>mid){
    29         update((i<<1)|1,left,right);
    30     }else{
    31         update(i<<1,left,mid);
    32         update((i<<1)|1,mid+1,right);
    33     }
    34     tree[i].w=tree[i<<1].w+tree[(i<<1)|1].w;
    35 }
    36 int find(int i,int left,int right){
    37     if(tree[i].w==0)return 0;
    38     if(left==right) return 1;
    39     if(tree[i].l==left&&tree[i].r==right){
    40         return tree[i].w;
    41     }
    42     int mid=(tree[i].l+tree[i].r)>>1;
    43     if(right<=mid){
    44         return find(i<<1,left,right);
    45     }else if(left>mid){
    46         return find((i<<1)|1,left,right);
    47     }else{
    48         return find(i<<1,left,mid)+find((i<<1)|1,mid+1,right);
    49     }
    50 }
    51 int main(){
    52     int L,M,le,ri;
    53     cin>>L>>M;
    54     create(1,0,L);
    55     while(M--){
    56         cin>>le>>ri;
    57         update(1,le,ri);
    58     }
    59     cout<<find(1,0,L)<<endl;
    60     return 0;
    61 }
     
  • 相关阅读:
    【HDOJ】5179 beautiful number
    【HDOJ】3459 Rubik 2×2×2
    【HDOJ】3419 The Three Groups
    【HDOJ】3085 Nightmare Ⅱ
    【HDOJ】3451 Beat drop
    【HDOJ】3309 Roll The Cube
    WP手机使用记录
    WinCE系统下应用崩溃原因的分析方法
    指针减法
    WinCE Overlay
  • 原文地址:https://www.cnblogs.com/yifan2016/p/5273050.html
Copyright © 2011-2022 走看看