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:

  1. 500 3
  2. 150 300
  3. 100 200
  4. 470 471
输出样例#1:

  1. 298

说明

NOIP2005普及组第二题

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

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

思路:

  1)模拟!

    数据范围辣么小!!!直接开个布尔数组记录一下是不是被砍了不就行咯?最后从头到尾扫一遍,没被砍就ans++,最后输出ans,完啦~

  2)线段树!

    其实我是很惊讶的!这么个模拟就能够水过去的题还可以用线段树做,代码虽然也不长,但是比模拟要长上好多QwQ

    但是我还是作死的写了.Orz.

代码酱来也~

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4.  
  5. using namespace std;
  6.  
  7. const int M = 1e4 + ;///范围QwQ
  8. int Ls,m,ans;
  9. bool kan[M];///记录是否被砍掉
  10.  
  11. int main()
  12. {
  13. scanf("%d%d",&Ls,&m);
  14. int l,r;
  15. for(int i=;i<m;i++)
  16. {
  17. scanf("%d%d",&l,&r);
  18. if(l>r) swap(l,r);///闲得慌hhh
  19. for(int j=l;j<=r;j++)
  20. {
  21. if(!kan[j]) kan[j]=;///砍啦~~~
  22. }
  23. }
  24. for(int i=;i<=Ls;i++)
  25. if(!kan[i]) ans++;
  26. printf("%d",ans);
  27. return ;
  28. }

模拟

  1. #include <iostream>
  2. #include <cstdio>
  3. ///方便快捷的写代码~
  4. #define lez k<<1
  5. #define rez k<<1|1
  6. #define mid ((l+r)>>1)
  7.  
  8. using namespace std;
  9.  
  10. const int M = 1e4 + ;
  11. int Ls,Ms;
  12. int lefts,rights;
  13.  
  14. struct Trees{
  15. int l,r;
  16. int now;///当前有多少棵没被砍掉的树
  17. }t[M*];///!!!要开四倍空间
  18.  
  19. inline void build(int k,int ld,int rd)
  20. {///建树过程
  21. t[k].l=ld,t[k].r=rd;///赋值
  22. if(ld==rd)
  23. {
  24. t[k].now=;///递归到叶子节点
  25. return ;
  26. }
  27. int m = (ld+rd) >> ;///中间节点
  28. build(lez,ld,m);///建左子树
  29. build(rez,m+,rd);///右子树
  30. t[k].now=t[lez].now+t[rez].now;///更新棵数
  31. }
  32.  
  33. inline void change(int l,int r,int k)
  34. {///更新线段树,以及我们更新要建火车站的范围
  35. l=t[k].l,r=t[k].r;
  36. ///如果当前递归到的是超出需要修改的范围的(或者该地已经没有树咯),就跳出
  37. if(l>rights || r<lefts || t[k].now == ) return ;
  38. ///如果刚好在范围之内
  39. if(lefts<=l && rights>=r)
  40. {
  41. t[k].now=;///进行修改
  42. return ;
  43. }
  44. change(l,mid,lez);///更新左子树
  45. change(mid+,r,rez);///右子树
  46. t[k].now=t[lez].now+t[rez].now;///必须更新棵数!!!
  47. }
  48.  
  49. int main()
  50. {
  51. scanf("%d%d",&Ls,&Ms);
  52. Ls++;///因为题目中的是从0开始的,所以要多加一个
  53. build(,,Ls);
  54. for(int i=;i<=Ms;i++)///类似于Ms次修改询问???
  55. {
  56. scanf("%d%d",&lefts,&rights);///左右端点
  57. lefts++;rights++;
  58. change(,Ls,);
  59. }
  60. printf("%d",t[].now);///最后直接输出第一个根节点的棵树,不就行了咩?
  61. return ;
  62. }
  63. ///End.

线段树

End.

luogu P1047 校门外的树 x的更多相关文章

  1. luogu P1047 校门外的树

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

  2. P1047 校门外的树

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

  3. 洛谷P1047 校门外的树

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

  4. 洛谷——P1047 校门外的树

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

  5. Luogu P1276 校门外的树(增强版)

    Luogu P1276 校门外的树(增强版) 本来看着是道普及-,就不打算写博客了,结果因为出了3次错,调试了15min就还是决定写一下-- 本题坑点: 1.每个位置有三种情况:空穴,树苗,树(而不只 ...

  6. 【洛谷】【线段树】P1047 校门外的树

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

  7. [模拟]P1047 校门外的树

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

  8. 洛谷 P1047 校门外的树(待完善)

    链接:https://www.luogu.org/problemnew/show/P1047 题目: 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是11米.我们可以把马路看 ...

  9. 洛谷题解P1047 校门外的树

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

随机推荐

  1. 抓包工具tcpdump用法说明--2

    第一招: 通俗的说,tcpdump是一个抓包工具,用于抓取互联网上传输的数据包.形象的说,tcpdump就好比是国家海关,驻扎在出入境的咽喉要道,凡是要入境和出境的集装箱,海关人员总要打开箱子,看看里 ...

  2. MySQL使用Navicat远程连接时报错1251

    1.报错信息 client does not support authentication protocol requested by server:consider upgrading MySQL ...

  3. 剑指offer--day10

    1.1 题目:二叉搜索树的后序遍历序列:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 1.2 思路: 以{ ...

  4. 为什么说 Babel 将推动 JavaScript 的发展【转】

    Babel是一个转换编译器,它能将 ES6 转换成可以在浏览器中运行的代码.Babel 由来自澳大利亚的开发者Sebastian McKenzie创建.他的目标是使 Babel 可以处理 ES6 的所 ...

  5. MySQL练习与小结

    当你专注一件事的时候,时间总是过得很快! foreign key 练习 -- 切换数据库 use stumgr -- 删除班级表 drop table t_class1 -- 创建一个班级表 crea ...

  6. windows10配置Docker容器独立IP地址互相通信

    Docker官方推荐我们通过端口映射的方式把Docker容器的服务提供给宿主机或者局域网其他容器使用.一般过程是: 1.Docker进程通过监听宿主机的某个端口,将该端口的数据包发送给Docker容器 ...

  7. 不定参数(rest 参数 ...)

    不定参数 如何实现不定参数 使用过 underscore.js 的人,肯定都使用过以下几个方法: _.without(array, *values) //返回一个删除所有values值后的array副 ...

  8. redis关闭和启动

    redis关闭 到redis节点目录下执行如下命令 redis-cli -p 端口号 shutdown redis启动 ./redis-server 参数 参数:redis.conf文件全路径 需要到 ...

  9. SQL语句-exec执行

    动态sql语句基本语法1 :普通SQL语句可以用Exec执行 eg:   Select * fromtableName        Exec('select * from tableName')   ...

  10. 微信支付签名算法JavaScript版,参数名ASCII码从小到大排序;0,A,B,a,b;

    // 支付md5加密获取sign paysignjs: function (jsonobj) { var signstr = this.obj2str(jsonobj) signstr = signs ...