D. 实验室传染病

题意

给出 n 个人的位置,以及每个人的传染范围,当一个人患病时,他的传染范围内(包括边界上)的人全部会被感染并继续向外传播。

求以每个人为传染源最多有多少人被感染。

分析

首先二分预处理每个人一次最远感染到的人,然后线段树维护区间,表示每个点最远感染到右边的人以及感染到左边的人,不断查询,并扩大区间,因为右边最远点可能由于左边的传染点导致的。

最后,更新的时候要随机一个1~n的序列,不然会超时,应该有一组数据会卡掉按顺序更新的。

3
1 2
4 2
7 1
ans: 1 1 1 7
-21 19
-2 2
8 8
18 10
20 1
22 1
0 20
ans:7 6 6 6 1 1 6 5
0 20
8 3
10 1
18 10
20 1
ans: 5 2 1 4 1

code

#include<cstdio>
#include<algorithm>
#include<cstring>
#define rson m + 1, r, rt << 1 | 1
#define lson l, m, rt << 1
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int MAXN = 1e5 + 10;
const int INF = 2e9;
struct node
{
int x, d, id;
bool operator < (const node& other) const
{
return x < other.x;
}
}a[MAXN];
int r_[MAXN], l_[MAXN];
int ans[MAXN];
int n;
int mnl[MAXN << 2], mxr[MAXN << 2];
void PushUp(int rt)
{
mnl[rt] = min(mnl[rt << 1], mnl[rt << 1 | 1]);
mxr[rt] = max(mxr[rt << 1], mxr[rt << 1 | 1]);
}
void build(int l, int r, int rt)
{
if(l == r)
{
mnl[rt] = l_[l];
mxr[rt] = r_[l];
return ;
}
int m = (l + r) >> 1;
build(lson);
build(rson);
PushUp(rt);
}
void update(int pos, int l0, int r0, int l, int r, int rt)
{
if(l == r)
{
mxr[rt] = max(mxr[rt], r0);
mnl[rt] = min(mnl[rt], l0);
return;
}
int m = (l + r) >> 1;
if(m >= pos) update(pos, l0, r0, lson);
else update(pos, l0, r0, rson);
PushUp(rt);
}
P query(int L, int R, int l, int r, int rt)
{
if(L <= l && R >= r)
{
return P(mnl[rt], mxr[rt]);
}
int m = (l + r) >> 1;
P p(INF, 0);
if(m >= L)
{
p = query(L, R, lson);
}
if(m < R)
{
P tmp = query(L, R, rson);
p.first = min(p.first, tmp.first);
p.second = max(p.second, tmp.second);
}
return p;
}
void init() // 找一次感染最远感染点
{
for(int i = 1; i <= n; i++)
{
r_[i] = upper_bound(a + 1, a + 1 + n, node{a[i].x + a[i].d, 0, 0}) - a - 1;
l_[i] = lower_bound(a + 1, a + 1 + n, node{a[i].x - a[i].d, 0, 0}) - a;
}
}
vector<int> v;
int main()
{
while(~scanf("%d", &n))
{
v.clear();
for(int i = 0; i < MAXN * 4; i++)
{
mnl[i] = INF;
mxr[i] = 0;
}
for(int i = 1; i <= n; i++)
{
scanf("%d%d", &a[i].x, &a[i].d);
a[i].id = i;
v.push_back(i);
}
sort(a + 1, a + 1 + n);
init();
build(1, n, 1);
random_shuffle(v.begin(), v.end());
for(int j = 0; j < n; j++)
{
int i = v[j];
int l0 = l_[i], r0 = r_[i];
while(true)
{
P p = query(l0, r0, 1, n, 1);
if(p.first == l0 && p.second == r0) break;
l0 = p.first;
r0 = p.second;
}
update(i, l0, r0, 1, n, 1);
ans[a[i].id] = r0 - l0 + 1;
}
for(int i = 1; i <= n; i++)
{
printf("%d%c", ans[i], i == n ? '\n' : ' ');
}
}
return 0;
}

D. 实验室传染病的更多相关文章

  1. EOJ 3246 实验室传染病

    线段树,暴力. 先处理出每个点直接能感染到的最左边的和最右边的. 之后每次扩展,看向左能到达的那些点中,最左以及最右能到哪些点,更新. 看向右能到达的那些点中,最左以及最右能到哪些点,更新. 最左最右 ...

  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. C 语言实现字符串替换

    void replaceFirst(char *str1,char *str2,char *str3) { ]; char *p; strcpy(str4,str1); if((p=strstr(st ...

  2. 深度学习入门实战(二)-用TensorFlow训练线性回归

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者 :董超 上一篇文章我们介绍了 MxNet 的安装,但 MxNet 有个缺点,那就是文档不太全,用起来可能 ...

  3. Redisson入门

    Redisson入门 Author:Ricky  Date:2017-04-24 Redisson概述 Redisson是架设在Redis基础上的一个Java驻内存数据网格(In-Memory Dat ...

  4. Linux 练习(1)

    1) 新建用户natasha,uid为1000,gid为555,备注信息为"master" useradd -u 1000 -g 555 -c 'master' natasha2) ...

  5. bzoj4827 [Hnoi2017]礼物

    Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在 ...

  6. PhpMyAdmin导入数据库大小限制?

    问题描述: 在phpMyAdmin中导入数据库时,出现问题: 1. 如果按照扩展名.sql导入,提示如下: 没有接收到要导入的数据.可能是文件名没有提交,也可能是文件大小超出 PHP 限制. 2. 如 ...

  7. windows下安装Redis并部署成服务

    windows下安装Redis并部署成服务 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 一:下载 下载地址: windows版本: http ...

  8. poj3160强连通分量加dfs

    After retirement as contestant from WHU ACM Team, flymouse volunteered to do the odds and ends such ...

  9. javascript 表达式和运算符 (二)

    表达式是一种JS短语,可使JS解释器用来产生一个值. 一.表达式 表达式分类 1.原始表达式 常量.直接量 (3.14,"test"); 关键字 (null,this,true): ...

  10. redis持久化快速回忆手册

    Redis提供的持久化机制: 1). RDB持久化:该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘. 2). AOF持久化:该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服 ...