题意: 有n个地鼠,m个CD碟,每个CD碟有一个影响范围,范围内的地鼠都会被吵到,每次有一个操作就是移动CD碟,然后求每次被影响的地鼠有多少只。

解法: 线段树做。我们只关注地鼠有没有被吵到就可以了,之前我还去把所有可能移到的位置都存下来离散化一下,然后维护也维护错了。一堆bug,真是想多了。

线段树维护两个值:  cntS[rt]表示该段被多少个区间所覆盖, NOG[rt]表示此区间内没有被影响到的地鼠有多少个。

那么我们更新到区间,然后直接pushup即可, 因为更新到区间的时候已经可以确定NOG[rt]了:

如果 l == r : 说明是叶子节点, 那么如果cntS[rt] > 0,NOG[rt]就为0,否则为1

否则,如果cntS[rt] = 0 , 那么 NOG[rt] = NOG[2*rt]+NOG[2*rt+1],  否则说明这段被区间覆盖,NOG[rt] = 0.

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <algorithm>
  7. using namespace std;
  8. #define N 501007
  9.  
  10. int NOG[*N],cntS[*N];
  11. struct Shift{
  12. int L1,R1,L2,R2;
  13. }sf[];
  14. int x[],b[];
  15. int seg[][];
  16.  
  17. void pushup(int l,int r,int rt)
  18. {
  19. if(l == r)
  20. {
  21. if(cntS[rt]) NOG[rt] = ;
  22. else NOG[rt] = ;
  23. return;
  24. }
  25. if(!cntS[rt]) NOG[rt] = NOG[rt<<] + NOG[rt<<|];
  26. else NOG[rt] = ;
  27. }
  28.  
  29. void build(int l,int r,int rt)
  30. {
  31. cntS[rt] = ;
  32. if(l == r)
  33. {
  34. NOG[rt] = ;
  35. return;
  36. }
  37. int mid = (l+r)/;
  38. build(l,mid,*rt);
  39. build(mid+,r,*rt+);
  40. pushup(l,r,rt);
  41. }
  42.  
  43. void update(int l,int r,int aa,int bb,int val,int rt)
  44. {
  45. if(aa <= l && bb >= r)
  46. {
  47. cntS[rt] += val;
  48. pushup(l,r,rt);
  49. return;
  50. }
  51. int mid = (l+r)/;
  52. if(aa <= mid)
  53. update(l,mid,aa,bb,val,*rt);
  54. if(bb > mid)
  55. update(mid+,r,aa,bb,val,*rt+);
  56. pushup(l,r,rt);
  57. }
  58.  
  59. int main()
  60. {
  61. int n,m,d,l,i,j,val,p,r;
  62. while(scanf("%d%d%d%d",&n,&m,&d,&l)!=EOF)
  63. {
  64. x[] = ;
  65. for(i=;i<=n;i++)
  66. scanf("%d",&x[i]);
  67. for(i=;i<=m;i++)
  68. {
  69. scanf("%d",&val);
  70. seg[i][] = max(,val-l);
  71. seg[i][] = min(,val+l);
  72. }
  73. for(i=;i<=d;i++)
  74. {
  75. scanf("%d%d",&p,&r);
  76. sf[i].L1 = max(,p-l);
  77. sf[i].R1 = min(,p+l);
  78. sf[i].L2 = max(,r-l);
  79. sf[i].R2 = min(,r+l);
  80. }
  81. build(,n,);
  82. for(i=;i<=m;i++)
  83. {
  84. int L = lower_bound(x+,x+n+,seg[i][])-x;
  85. int R = upper_bound(x+,x+n+,seg[i][])-x;
  86. R--;
  87. update(,n,L,R,,);
  88. }
  89. printf("%d\n",n-NOG[]);
  90. for(i=;i<=d;i++)
  91. {
  92. int L1 = lower_bound(x+,x+n+,sf[i].L1)-x;
  93. int R1 = upper_bound(x+,x+n+,sf[i].R1)-x-;
  94. int L2 = lower_bound(x+,x+n+,sf[i].L2)-x;
  95. int R2 = upper_bound(x+,x+n+,sf[i].R2)-x-;
  96. update(,n,L1,R1,-,);
  97. update(,n,L2,R2,,);
  98. printf("%d\n",n-NOG[]);
  99. }
  100. }
  101. return ;
  102. }

2014-2015 Codeforces Trainings Season 2 Episode 7 G Gophers --线段树的更多相关文章

  1. 2016-2017 CT S03E06: Codeforces Trainings Season 3 Episode 6(8/13)

    2016-2017 CT S03E06: Codeforces Trainings Season 3 Episode 6 比赛连接: http://codeforces.com/gym/101124/ ...

  2. 2016-2017 CT S03E05: Codeforces Trainings Season 3 Episode 5 (2016 Stanford Local Programming Contest, Extended) E

    链接:http://codeforces.com/gym/101116 学弟写的,以后再补 #include <iostream> #include <algorithm> # ...

  3. 2016-2017 CT S03E05: Codeforces Trainings Season 3 Episode 5 (2016 Stanford Local Programming Contest, Extended) J

    链接:http://codeforces.com/gym/101116 题意:给出n个点,要求一个矩形框将(n/2)+1个点框住,要面积最小 解法:先根据x轴选出i->j之间的点,中间的点(包括 ...

  4. 2016-2017 CT S03E05: Codeforces Trainings Season 3 Episode 5 (2016 Stanford Local Programming Contest, Extended) I

    链接:http://codeforces.com/gym/101116 题意:选六个数,必须出现次数最多,且数字最小,如果出现7优先加入7 解法:排序,出现7优先加入7,最后再将6个数排序 #incl ...

  5. 2016-2017 CT S03E05: Codeforces Trainings Season 3 Episode 5 (2016 Stanford Local Programming Contest, Extended) B

    链接:http://codeforces.com/gym/101116 学弟做的,以后再补 #include <iostream> #include <stdio.h> #in ...

  6. 2016-2017 CT S03E07: Codeforces Trainings Season 3 Episode 7 - HackerEarth Problems Compilation

    B: 思路: 暴力,每两个判断一下; C: 思路: 容斥定理,先枚举脖子下面那个点和那个不可描述的点,算出所有的方案数,这里面有多的腿当成了脖子或者胳膊的,然后就再枚举这种情况把这些减去,又减多了; ...

  7. 2016-2017 CT S03E02: Codeforces Trainings Season 3 Episode 2

    A HHPaint B Square Root C Interesting Places D Road to Home E Ant and apples F Square G Pair H The F ...

  8. 2016-2017 CT S03E06: Codeforces Trainings Season 3 Episode 6 The Baguette Master

    比赛看不懂 之后不确定题意去瞄了题解,需要分类讨论?囧 之后按照队友已经ac的题意 就是求外面一圈周长,直接可以求得 #include<bits/stdc++.h> using names ...

  9. 2016-2017 CT S03E07: Codeforces Trainings Season 3 Episode 7

    B. Pen Pineapple Apple Pen Solved. 题意:将一个序列合并成一个数. 思路:分类讨论一下, 水. #include<bits/stdc++.h> using ...

随机推荐

  1. [moka学习笔记]yii2设置语言和时区

    1.在web/index.php中 (new yii\web\Application($config))->run(); $app = new \yii\web\Application($con ...

  2. (旧)子数涵数·Flash——影片剪辑的其他操作

    一.复制影片剪辑 1.方法:duplicatemovieClip(影片实名,新实名,深度级别) 2.解释:影片实名就是你要复制的对象,新实名就是你要粘贴的对象,深度级别就是粘贴后的影片剪辑的堆叠顺序( ...

  3. redis3.0 集群实战3 - java编程实战

    本文主要描述使用jedis进行redis-cluster操作   jedis jedis是redis官方推荐使用的java redis客户端,github地址为,https://github.com/ ...

  4. 你可以使用 play framework 做5件很爽的事情http://www.anool.net/?p=629

    1.绑定HTTP参数到JAVA方法里的参数. 使用PLAY可以很简单的从JAVA代码中检索HTTP参数.只要把方法参数申明成和HTTP参数相同既可. 比如,这个request: Http代码 /art ...

  5. CentOS下apache绑定域名

    本文主要介绍在CentOS下apache绑定域名以及apache绑定多个域名,首先要找到apache的配置文件httpd.conf的位置.CentOS操作系统一般在 /etc/httpd/conf 下 ...

  6. python基础之基本算法和装饰器

    1.冒泡排序 关于冒泡排序实现大小比较,大索引会向后移动,这次循环将最大数值直接移动至最后. li = [,,,,] ): ]: temp = li[i] li[i] = li[i + ] li[i ...

  7. Vue方法与事件

    gitHub地址:https://github.com/lily1010/vue_learn/tree/master/lesson10 一 vue方法实现 <!DOCTYPE html> ...

  8. RHEL7管道与重定向

    文件描述符 可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作 用户可以自定义文件描述符范围是:3-num,这个最大数字,跟 ...

  9. How to copy files between sites using JavaScript REST in Office365 / SharePoint 2013

    http://techmikael.blogspot.in/2013/07/how-to-copy-files-between-sites-using.html I'm currently playi ...

  10. FileInputStream类

    FileInputStream和FileOutPutStream类都是用来操作磁盘文件的.如果用户对文件读取需求比较简单,则可以使用FileInputStream类,该类继承InputStream类 ...