线段树,暴力。

先处理出每个点直接能感染到的最左边的和最右边的。

之后每次扩展,看向左能到达的那些点中,最左以及最右能到哪些点,更新。

看向右能到达的那些点中,最左以及最右能到哪些点,更新。

最左最右能到哪些点,可以用线段树计算区间最小值最大值。

如果某次无法更新,那么结束。

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. int n;
  8. struct X
  9. {
  10. int x,y;
  11. int ll,rr;
  12. int id;
  13. }s[100010];
  14.  
  15. int L[100010], R[100010], ans[100010];
  16.  
  17. bool cmp(X a,X b)
  18. {
  19. return a.x<b.x;
  20. }
  21.  
  22. int mn[2][4*100010];
  23. int mx[2][4*100010];
  24.  
  25. int B;
  26.  
  27. void update(int op,int pos,int val,int l,int r,int rt)
  28. {
  29. if(l==r)
  30. {
  31. mn[op][rt] = mx[op][rt] = val;
  32. return ;
  33. }
  34.  
  35. int mid = ( l + r) / 2;
  36. if(pos<=mid) update(op,pos,val,l,mid,2*rt);
  37. else update(op,pos,val,mid+1,r,2*rt+1);
  38.  
  39. mn[op][rt] = min(mn[op][2*rt], mn[op][2*rt+1]);
  40. mx[op][rt] = max(mx[op][2*rt], mx[op][2*rt+1]);
  41. }
  42.  
  43. void MIN(int op,int L,int R,int l,int r,int rt)
  44. {
  45. if(L<=l&&r<=R)
  46. {
  47. B = min(B,mn[op][rt]);
  48. return ;
  49. }
  50.  
  51. int mid = ( l + r) / 2;
  52. if(L<=mid) MIN(op,L,R,l,mid,2*rt);
  53. if(R>mid) MIN(op,L,R,mid+1,r,2*rt+1);
  54. }
  55.  
  56. void MAX(int op,int L,int R,int l,int r,int rt)
  57. {
  58. if(L<=l&&r<=R)
  59. {
  60. B = max(B,mx[op][rt]);
  61. return ;
  62. }
  63.  
  64. int mid = ( l + r) / 2;
  65. if(L<=mid) MAX(op,L,R,l,mid,2*rt);
  66. if(R>mid) MAX(op,L,R,mid+1,r,2*rt+1);
  67. }
  68.  
  69. int main()
  70. {
  71. scanf("%d",&n);
  72. for(int i=1;i<=n;i++)
  73. {
  74. scanf("%d%d",&s[i].x,&s[i].y);
  75. s[i].ll = s[i].x - s[i].y;
  76. s[i].rr = s[i].x + s[i].y;
  77. s[i].id = i;
  78. }
  79.  
  80. sort(s+1,s+1+n,cmp);
  81.  
  82. for(int i=1;i<=n;i++)
  83. {
  84. int left = 1, right = i, pos;
  85. while(left <= right)
  86. {
  87. int mid = (left + right)/2;
  88. if(s[mid].x >= s[i].ll) pos = mid, right = mid-1;
  89. else left = mid + 1;
  90. }
  91.  
  92. L[i] = pos;
  93.  
  94. left = i, right = n;
  95. while(left<=right)
  96. {
  97. int mid = (left + right)/2;
  98. if(s[mid].x <= s[i].rr) pos = mid, left = mid+1;
  99. else right = mid - 1;
  100. }
  101.  
  102. R[i] = pos;
  103. }
  104.  
  105. for(int i=1;i<=n;i++)
  106. {
  107. update(0,i,L[i],1,n,1);
  108. update(1,i,R[i],1,n,1);
  109. }
  110.  
  111. while(1)
  112. {
  113. bool f = 0;
  114.  
  115. for(int i=1;i<=n;i++)
  116. {
  117. B = n+1;
  118. MIN(0,L[i],i,1,n,1);
  119. if(B != L[i]) f=1, L[i] = B, update(0,i,L[i],1,n,1);
  120. }
  121.  
  122. for(int i=n;i>=1;i--)
  123. {
  124. B = 0;
  125. MAX(1,i,R[i],1,n,1);
  126. if(B != R[i]) f=1, R[i] = B, update(1,i,R[i],1,n,1);
  127. }
  128.  
  129. for(int i=1;i<=n;i++)
  130. {
  131. B = 0;
  132. MAX(1,L[i],i,1,n,1);
  133. if(B != R[i]) f=1, R[i] = B, update(1,i,R[i],1,n,1);
  134. }
  135.  
  136. for(int i=n;i>=1;i--)
  137. {
  138. B = n+1;
  139. MIN(0,i,R[i],1,n,1);
  140. if(B != L[i]) f=1, L[i] = B, update(0,i,L[i],1,n,1);
  141. }
  142.  
  143. if( f == 0 ) break;
  144. }
  145.  
  146. for(int i=1;i<=n;i++) ans[s[i].id] = R[i] - L[i] + 1;
  147.  
  148. for(int i=1;i<=n;i++)
  149. {
  150. printf("%d",ans[i]);
  151. if(i<n) printf(" ");
  152. else printf("\n");
  153. }
  154.  
  155. return 0;
  156. }

EOJ 3246 实验室传染病的更多相关文章

  1. D. 实验室传染病

    D. 实验室传染病 题意 给出 n 个人的位置,以及每个人的传染范围,当一个人患病时,他的传染范围内(包括边界上)的人全部会被感染并继续向外传播. 求以每个人为传染源最多有多少人被感染. 分析 首先二 ...

  2. “国家重点实验室”完全名单_洹水泛舟_新浪博客 - Google Chrome

    “国家重点实验室”完全名单 单位名称(序号)   国家重点实验室名称  建设单位 中国科学院(73) 1   半导体超晶格国家重点实验室  中国科学院半导体研究所 2   应用光学国家重点实验室  中 ...

  3. 【AR实验室】mulberryAR : ORBSLAM2+VVSION

    本文转载请注明出处 —— polobymulberry-博客园 0x00 - 前言 mulberryAR是我业余时间弄的一个AR引擎,目前主要支持单目视觉SLAM+3D渲染,并且支持iOS端,但是该引 ...

  4. 认识实验室信息管理系统(LIMS)

    在当今互联网如日中天的大环境下,各种伴随着互联网的产物如p2p,o2o在如火如荼的进行着,吸引了大量的开发人员都涌向了这个行业,所有的技术似乎都在围绕着互联网发展,传统行业软件开发的人气和关注度就相形 ...

  5. LYK 与实验室

    LYK 与实验室(lab)Time Limit:5000ms Memory Limit:64MB[题目描述] LYK 在一幢大楼里,这幢大楼共有 n 层,LYK 初始时在第 a 层上.这幢大楼有一个秘 ...

  6. 实验室中搭建Spark集群和PyCUDA开发环境

    1.安装CUDA 1.1安装前工作 1.1.1选取实验器材 实验中的每台计算机均装有双系统.选择其中一台计算机作为master节点,配置有GeForce GTX 650显卡,拥有384个CUDA核心. ...

  7. Web Design:给实验室UI们的一堂课(上)

    实验室的UI越来越水,设计什么的做的一塌糊涂,所以拖了很久,就想给他们讲一下设计或者说入门吧,上周末才倒出来时间. 这里放上PPT和讲稿吧,懒得去整理板式了. 主要讲了一下Web Design怎么做, ...

  8. 大一暑假为期五周的ACM实验室培训结束了(2013.8.24)

    没想到,我的大学里第一个暑假,9周的时间只有最初的两周在家待着,接下来的7周将会在学校度过. 说真的,这是我上学以来,第一次真正好好利用的假期.在这五周里,周一.三.五下午学长都会给我们讲点知识,之后 ...

  9. Data.gov.uk电子政务云,牛津大学NIE金融大数据实验室王宁:数据治理的现状和实践

    牛津大学NIE金融大数据实验室王宁:数据治理的现状和实践 我是牛津互联网研究院的研究员,是英国开放互联网的一个主要的研究机构和相关政策制订的一个机构.今天主要给大家介绍一下英国数据治理的一些现状和实践 ...

随机推荐

  1. 基于JavaSE阶段的IO流详解

    1.IO流基本概述 在Java语言中定义了许多针对不同的传输方式,最基本的就是输入输出流(俗称IO流),IO流是属于java.io包下的内容,在JavaSE阶段主要学下图所示的: 其中从图中可知,所有 ...

  2. oracle实用的sqlplus命令

    有时候难免没有工具,得自己手动输入sqlplus命令 执行SQL文件:@sql文件,例如:@/home/myuser/sql/test.sql查看数据库存在的存储过程:Select object_na ...

  3. Linux centos7下设置Tomcat开机自启动

    1,centos7 使用 systemctl 替换了 service命令 参考:redhat文档: https://access.redhat.com/documentation/en-US/Red_ ...

  4. POJ 1228 Grandpa's Estate 凸包 唯一性

    LINK 题意:给出一个点集,问能否够构成一个稳定凸包,即加入新点后仍然不变. 思路:对凸包的唯一性判断,对任意边判断是否存在三点及三点以上共线,如果有边不满足条件则NO,注意使用水平序,这样一来共线 ...

  5. javaScript基础语法介绍

    简介 JavaScript是一种脚本语言. (脚本,一条条的文字命令.执行时由系统的一个解释器,将其一条条的翻译成机器可识别的指令,然后执行.常见的脚本:批处理脚本.T-SQL脚本.VBScript等 ...

  6. 2017ACM暑期多校联合训练 - Team 2 1006 HDU 6050 Funny Function (找规律 矩阵快速幂)

    题目链接 Problem Description Function Fx,ysatisfies: For given integers N and M,calculate Fm,1 modulo 1e ...

  7. CMDB概述(一)

    浅谈ITIL TIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central ...

  8. dataTables.js 响应式/package-lock.json 作用/eclipse 目录和工作区建立连接/navcat 导出数据库/vscode 快速进入方法

    下班时间到啦! --下班都是他们的,而我,什么都没有. 什么周五放松日,什么五四青年节,什么都么有.继续总结一下今天遇到的问题. dataTables.js 响应式 使用dataTables.js创建 ...

  9. Tornado/Python 学习笔记(二)

    部分ssrpc.py代码分析 -- 服务端: 1 #!/usr/bin/python3 2 3 from xmlrpc.client import Fault, dumps, loads 4 impo ...

  10. adb_usb.ini在adb找不到设备时

    不能连接不上adb,如下方法解决,步骤描述不愿意看的话,直接使用本文最下面的批处理命令,方法copy粘贴到新建的bat文件里运行,或者直接粘贴到dos窗口运行. 1. 使用androidsdk目录中的 ...