题目链接:http://bailian.openjudge.cn/practice/2808?lang=en_US

总时间限制:
1000ms
内存限制:
65536kB
描述
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
马路上有一些区域要用来建地铁,这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入
输入的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <=
100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
输出
输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
样例输入
  1. 500 3
  2. 150 300
  3. 100 200
  4. 470 471
样例输出
  1. 298
来源
noip2005普及组
这个题真是非常适合用来入门了,之前也做过线段树的专题,没做笔记,到现在快忘干净了,,,做笔记很重要额。。。

看代码吧,写的还算详细。当然这个题也可以通过标记来实现,耗费的时间差不多。(第一个是用线段树写的,第二个是用标记写的)

线段树代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. const int maxn = *;
  5. struct Tree
  6. {
  7. int l,r;
  8. int sum;
  9. }tree[maxn];
  10.  
  11. void build(int rt,int ll,int rr)
  12. {
  13. tree[rt].l = ll;
  14. tree[rt].r = rr;
  15. if(ll == rr) //左右节点相等说明到了叶子节点了
  16. {
  17. tree[rt].sum = ;// 这个节点最开始只有一棵树
  18. return ; //不写return会炸
  19. }
  20. int mid = (ll+rr)/;
  21. build(rt*,ll,mid); //向左建立左子树
  22. build(rt*+,mid+,rr); //向右建立右子树
  23. //父亲节点树的棵数是左右子节点树的棵数的和
  24. tree[rt].sum = tree[rt*].sum + tree[rt*+].sum;
  25. }
  26.  
  27. void update(int rt,int ll,int rr,int x,int y)
  28. {
  29. if(ll>y||rr<x||tree[rt].sum == ) //当[x,y]与当前区间[ll,rr]没有交集时和树的棵树为零时;
  30. return ;
  31. if(x<=ll&&y>=rr)
  32. {
  33. tree[rt].sum = ; //将此区间树拔光
  34. return ;
  35. }
  36. int mid = (ll+rr)/; //别取成要查找区间的中止了,写错了找了好久的bug
  37. update(rt*,ll,mid,x,y); //二分寻找[ll,rr],使其与[x,y]有交集;
  38. update(rt*+,mid+,rr,x,y);
  39. tree[rt].sum = tree[rt*].sum + tree[rt*+].sum;
  40. }
  41. int main()
  42. {
  43. int L,M;
  44. int x,y;
  45. // scanf("%d%d",&L,&M);
  46. cin>>L>>M;
  47. build(,,L+);
  48. for(int i=;i<M;i++)
  49. {
  50. // scanf("%d%d",&x,&y);
  51. cin>>x>>y;
  52. update(,,L+,x+,y+);
  53. }
  54. int ans = tree[].sum;
  55. printf("%d\n",ans);
  56. return ;
  57. }

标记代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include <cstring>
  4. using namespace std;
  5.  
  6. const int maxn = ;
  7. int L,M;
  8. int x,y;
  9. int sum;
  10. int maze[maxn]; //将某段区间内的值全部标记为1;
  11.  
  12. int main()
  13. {
  14. while(scanf("%d%d",&L,&M)!=EOF)
  15. {
  16. memset(maze,,sizeof(maze));
  17. sum = ;
  18. for(int i=;i<M;i++)
  19. {
  20. cin>>x>>y;
  21. for(int ii = x;ii<=y;ii++)
  22. {
  23. if(maze[ii]==)
  24. continue;
  25. maze[ii] = ;
  26. }
  27. }
  28. for(int i=;i<=L;i++)
  29. {
  30. if(maze[i] == ) //统计不是0的个数,也就是剩余的树的数目;
  31. sum++;
  32. }
  33. cout<<sum<<endl;
  34. }
  35. return ;
  36. }

Bailian 2808 校门外的树(入门线段树)的更多相关文章

  1. bzoj 3226 [Sdoi2008]校门外的区间(线段树)

    3226: [Sdoi2008]校门外的区间 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 615  Solved: 227[Submit][Stat ...

  2. 3226. [SDOI2008]校门外的区间【线段树】

    Description   受校门外的树这道经典问题的启发,A君根据基本的离散数学的知识,抽象出5种运算维护集合S(S初始为空)并最终输出S.现在,请你完成这道校门外的树之难度增强版——校门外的区间. ...

  3. LOJ#510. 「LibreOJ NOI Round #1」北校门外的回忆(线段树)

    题面 传送门 题解 感谢\(@M\_sea\)的代码我总算看懂题解了-- 这个操作的本质就是每次把\(x\)的\(k\)进制最低位乘\(2\)并进位,根据基本同余芝士如果\(k\)是奇数那么最低位永远 ...

  4. LOJ 北校门外的回忆 倍增+线段树

    正解:倍增+线段树 解题报告: 传送门! $umm$这题有个对正解毫无启发的部分分还有个正解,都挺神仙的所以我都写了趴$QAQ$ 先说部分分 可以考虑把$x$向$x+lowbit(x)$连边,然后当$ ...

  5. 线段树简单入门 (含普通线段树, zkw线段树, 主席树)

    线段树简单入门 递归版线段树 线段树的定义 线段树, 顾名思义, 就是每个节点表示一个区间. 线段树通常维护一些区间的值, 例如区间和. 比如, 上图 \([2, 5]\) 区间的和, 为以下区间的和 ...

  6. dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448

    4448: [Scoi2015]情报传递 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 588  Solved: 308[Submit][Status ...

  7. UVALive 7148 LRIP【树分治+线段树】

    题意就是要求一棵树上的最长不下降序列,同时不下降序列的最小值与最大值不超过D. 做法是树分治+线段树,假设树根是x,y是其当前需要处理的子树,对于子树y,需要处理出两个数组MN,MX,MN[i]表示以 ...

  8. [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】

    题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...

  9. BZOJ_2238_Mst_树剖+线段树

    BZOJ_2238_Mst_树剖+线段树 Description 给出一个N个点M条边的无向带权图,以及Q个询问,每次询问在图中删掉一条边后图的最小生成树.(各询问间独立,每次询问不对之后的询问产生影 ...

随机推荐

  1. n=n+1 放在print(s)的前/后的影响

    # 1+2+3+4+5+6+.....+100 = ? #关键在于,当n为时,才print(s) n = 1s = 0while n < 101: s = s + n if n ==100: # ...

  2. Python实现向s3共享存储上传和下载文件

    #!/usr/bin/env python #-*- encoding: utf8 -*- import boto import boto.s3.connection from boto.s3.key ...

  3. grep命令.md

    grep命令 简介 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Prin ...

  4. Zookeeper ZAB 协议分析[转]

    写在开始:这是我找到一篇比较好的博客,转载到这来进行备份原文参考: Zookeeper ZAB 协议分析 前言 ZAB 协议是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的原子广播 ...

  5. Zookeeper框架Curator使用

    本文参考自https://blog.csdn.net/wo541075754/article/details/69138878?utm_source=gold_browser_extension ht ...

  6. ethereumjs/ethereumjs-common-1-简介

    为了了解ethereumjs/ethereumjs-block-3-代码的使用需要了解的一个模块 https://github.com/ethereumjs/ethereumjs-common Com ...

  7. 集合之Vector

    在java提高篇(二一)—–ArrayList.java提高篇(二二)—LinkedList,详细讲解了ArrayList.linkedList的原理和实现过程,对于List接口这里还介绍一个它的实现 ...

  8. PAT乙级1012

    1012 数字分类 (20 分)   给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A​1​​ = 能被 5 整除的数字中所有偶数的和: A​2​​ = 将被 5 除后余 1 的 ...

  9. 小H和密码

    链接:https://www.nowcoder.com/acm/contest/72/B来源:牛客网 题目描述     小H在击败怪兽后,被一个密码锁挡住了去路     密码锁由N个转盘组成,编号为1 ...

  10. 404 Note Found 队-Beta1

    目录 组员情况 组员1(组长):胡绪佩 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最新成果 团 ...