D. 实验室传染病
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. 实验室传染病的更多相关文章
- EOJ 3246 实验室传染病
线段树,暴力. 先处理出每个点直接能感染到的最左边的和最右边的. 之后每次扩展,看向左能到达的那些点中,最左以及最右能到哪些点,更新. 看向右能到达的那些点中,最左以及最右能到哪些点,更新. 最左最右 ...
- “国家重点实验室”完全名单_洹水泛舟_新浪博客 - Google Chrome
“国家重点实验室”完全名单 单位名称(序号) 国家重点实验室名称 建设单位 中国科学院(73) 1 半导体超晶格国家重点实验室 中国科学院半导体研究所 2 应用光学国家重点实验室 中 ...
- 【AR实验室】mulberryAR : ORBSLAM2+VVSION
本文转载请注明出处 —— polobymulberry-博客园 0x00 - 前言 mulberryAR是我业余时间弄的一个AR引擎,目前主要支持单目视觉SLAM+3D渲染,并且支持iOS端,但是该引 ...
- 认识实验室信息管理系统(LIMS)
在当今互联网如日中天的大环境下,各种伴随着互联网的产物如p2p,o2o在如火如荼的进行着,吸引了大量的开发人员都涌向了这个行业,所有的技术似乎都在围绕着互联网发展,传统行业软件开发的人气和关注度就相形 ...
- LYK 与实验室
LYK 与实验室(lab)Time Limit:5000ms Memory Limit:64MB[题目描述] LYK 在一幢大楼里,这幢大楼共有 n 层,LYK 初始时在第 a 层上.这幢大楼有一个秘 ...
- 实验室中搭建Spark集群和PyCUDA开发环境
1.安装CUDA 1.1安装前工作 1.1.1选取实验器材 实验中的每台计算机均装有双系统.选择其中一台计算机作为master节点,配置有GeForce GTX 650显卡,拥有384个CUDA核心. ...
- Web Design:给实验室UI们的一堂课(上)
实验室的UI越来越水,设计什么的做的一塌糊涂,所以拖了很久,就想给他们讲一下设计或者说入门吧,上周末才倒出来时间. 这里放上PPT和讲稿吧,懒得去整理板式了. 主要讲了一下Web Design怎么做, ...
- 大一暑假为期五周的ACM实验室培训结束了(2013.8.24)
没想到,我的大学里第一个暑假,9周的时间只有最初的两周在家待着,接下来的7周将会在学校度过. 说真的,这是我上学以来,第一次真正好好利用的假期.在这五周里,周一.三.五下午学长都会给我们讲点知识,之后 ...
- Data.gov.uk电子政务云,牛津大学NIE金融大数据实验室王宁:数据治理的现状和实践
牛津大学NIE金融大数据实验室王宁:数据治理的现状和实践 我是牛津互联网研究院的研究员,是英国开放互联网的一个主要的研究机构和相关政策制订的一个机构.今天主要给大家介绍一下英国数据治理的一些现状和实践 ...
随机推荐
- 构造函数与普通函数的区别还有关于“new”操作符的一些原理
有一种创建对象的方法叫做工厂模式,例如: function person(name,age){ var o=new Object(); o.name=name; o.age=age; return o ...
- Apache URL重写规则
1.简介 Apached的重写功能,即是mod_rewrite模块功能,它是apache的一个模块.它的功能非常强大,可以操作URL中的所有部分. 因此我们就可以改写url,给用户提供一个简介大方的u ...
- CSAcademy Beta Round #3 a-game
题目连接 a-game 大意:有一个只包含A和B的字符串,两个人分别取这个串的子串,但是每一次取不能与之前取到过的子串有交集,最后谁取到的所有串中A的总数量少的判为胜.如果一样,则为平手. 给出这样的 ...
- QuartusII13.0使用教程详解(一个完整的工程建立)
好久都没有发布自己的博客了,因为最近学校有比赛,从参加到现在都是一脸懵逼,幸亏有bingo大神的教程,让我慢慢走上了VIP之旅,bingo大神的无私奉献精神值得我们每一个业界人士学习,向bingo致敬 ...
- shopping_cart
#!/usr/bin/env python # -*- coding: utf-8 -*- print('欢迎土豪光临随心所欲旗舰店') user_money = int(input('老板,请输入你 ...
- [UWP]了解模板化控件(9):UI指南
1. 使用TemplateSettings统一外观 TemplateSettings提供一组只读属性,用于在新建ControlTemplate时使用这些约定的属性. 譬如,修改HeaderedCont ...
- single number i && ii && iii
Problem statement Elementary knowledge: There is a popular question when I seeked my job at Beijing: ...
- iOS 使用 UIMenuController 且不隐藏键盘的方法
iOS 使用 UIMenuController 且不隐藏键盘的方法 在键盘显示的时候使用 UIMenuController 弹出菜单,保持键盘显示且可输入的状态. 实现方法有 修改响应链(推荐) 遵循 ...
- OC类的介绍
类的本质 类的本质其实也是一个对象(类对象) 类对象 类对象再程序运行时一直存在 类对象是一种数据结构,存储类的基本信息:类大小,类名称,类的版本以及消息与函数的映射表等 类对象所保存的信息在程序编译 ...
- java集合系列—ArrayList
ArrayList是工作以来使用频率最高的集合类.以前上课老师说不知道用什么集合类就用ArrayList,好吧,后面就这样了. public class ArrayList<E> exte ...