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 }
     
  • 相关阅读:
    java编译错误No enclosing instance of type TestFrame is accessible. Must qualify the allocation with an enclosing instance of type TestFrame (e.g. x.new A(
    java 2中创建线程方法
    动态规划基本思想
    关于eclipse编译一个工程多个main函数
    java Gui初识
    Eclipse中java项目的打包
    java 播放声音
    把资源文件夹导入到eclipse中
    Java建立JProgressBar
    How to grant permissions to a custom assembly that is referenced in a report in Reporting Services
  • 原文地址:https://www.cnblogs.com/yifan2016/p/5273050.html
Copyright © 2011-2022 走看看