题意:一条直线上有n个炸弹,给出每个炸弹的爆炸半径,可以引爆另一个炸弹爆炸。问:每个炸弹爆炸后,最多有几个炸弹一起爆炸?

迭代,用线段树更新。

 #include <cstdio>
#include <algorithm>
#include <iostream>
#define ll long long
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define X first
#define Y second
#define mp make_pair
#define pii pair<int, int>
#define gg puts("gg");
using namespace std;
const int N = 1e5+;
struct p{
int n, pos, ra;
p(){}
p(int pos, int ra):pos(pos), ra(ra){}
};
bool cmppos(p A, p B){
return A.pos < B.pos;
} p pp[N];
//after sort
int pos[N];
int lpos[N], rpos[N], now; struct Node{
int l, r;
Node(){}
Node(int l, int r):l(l), r(r){}
};
Node T[N<<];
void pushup(int rt){
T[rt].l = min(T[rt<<].l, T[rt<<|].l);
T[rt].r = max(T[rt<<].r, T[rt<<|].r);
}
void gao(Node& x, Node y){
if(x.l > y.l) x.l = y.l;
if(x.r < y.r) x.r = y.r;
}
void update(int x, Node y, int l, int r, int rt){
if(x == l&&x == r){
T[rt] = y;
return ;
}
int m = l+r >> ;
if(x <= m) update(x, y, lson);
else update(x, y, rson);
pushup(rt);
}
void build(int l, int r, int rt){
if(l == r){
T[rt].l = lpos[now];
T[rt].r = rpos[now];
now++;
return ;
}
int m = l+r >> ;
build(lson);
build(rson);
pushup(rt);
}
void query(Node& ans, int L, int R, int l, int r, int rt){
if(L <= l&& r <= R){
gao(ans, T[rt]);
return ;
}
int m = l+r >> ;
if(L <= m) query(ans, L, R, lson);
if(m < R) query(ans, L, R, rson);
}
int ans[N];
void debug(int i){
printf("%d: lpos:%d, rpos:%d\n", i, lpos[i], rpos[i]);
} int main(){
int n;
while(scanf("%d", &n), n){
for(int i = ; i <= n; i++){
pp[i].n = i;
scanf("%d%d", &pp[i].pos, &pp[i].ra);
pos[i] = pp[i].pos;
}
sort(pos+, pos+n+);
sort(pp+, pp+n+, cmppos); for(int i = ; i <= n; i++)
lpos[i] = pp[i].pos-pp[i].ra, rpos[i] = pp[i].pos+pp[i].ra; now = ;
build(, n, ); bool tag = true;
while(tag){
tag = false;
for(int i = ; i <= n; i++){
int lcan = lower_bound(pos+, pos+n+, lpos[i])-pos, rcan = upper_bound(pos+, pos+n+, rpos[i])-pos-;
ans[ pp[i].n ] = rcan-lcan+;
Node ret = Node(2e9, -2e9);
query(ret, lcan, rcan, , n, );
if(lpos[i] > ret.l||rpos[i] < ret.r) {
tag = true;
if(lpos[i] > ret.l) lpos[i] = ret.l;
if(rpos[i] < ret.r) rpos[i] = ret.r;
update(i, ret, , n, );
}
}
}
for(int i = ; i <= n; i++)
printf("%d%c", ans[i], " \n"[i == n]);
}
return ;
}

Can of Worms 【迭代/线段树】的更多相关文章

  1. zkw线段树详解

    转载自:http://blog.csdn.net/qq_18455665/article/details/50989113 前言 首先说说出处: 清华大学 张昆玮(zkw) - ppt <统计的 ...

  2. 有趣的 zkw 线段树(超全详解)

    zkw segment-tree 真是太棒了(真的重口味)!写篇博客纪念入门 emmm...首先我们来介绍一下 zkw 线段树这个东西(俗称 "重口味" ,与 KMP 类似,咳咳. ...

  3. 线段树(区间树)之区间染色和4n推导过程

    前言 线段树(区间树)是什么呢?有了二叉树.二分搜索树,线段树又是干什么的呢?最经典的线段树问题:区间染色:正如它的名字而言,主要解决区间的问题 一.线段树说明 1.什么是线段树? 线段树首先是二叉树 ...

  4. ZKW线段树入门

    Part 1 来说说它的构造 线段树的堆式储存 我们来转成二进制看看 小学生问题:找规律 规律是很显然的 一个节点的父节点是这个数左移1,这个位运算就是低位舍弃,所有数字左移一位 一个节点的子节点是这 ...

  5. BZOJ 4408: [Fjoi 2016]神秘数 可持久化线段树

    4408: [Fjoi 2016]神秘数 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4408 Description 一个可重复数字集 ...

  6. POJ2528:Mayor's posters(线段树区间更新+离散化)

    Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...

  7. CodeForces 266E More Queries to Array...(线段树+式子展开)

    开始觉得是规律题的,自以为是的推了一个规律,结果测试数据都没过....看了love神的博客才发现只是把式子展开就找到规律了.不过挺6的是我虽然想错了,但是维护的的东西没有错,只是改改(改了进两个小时好 ...

  8. ACM学习历程—HDU5696 区间的价值(分治 && RMQ && 线段树 && 动态规划)

    http://acm.hdu.edu.cn/showproblem.php?pid=5696 这是这次百度之星初赛2B的第一题,但是由于正好打省赛,于是便错过了.加上2A的时候差了一题,当时有思路,但 ...

  9. HDU5152 线段树 + 数论

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5152 ,线段树区间更新 + 点更新 + 数论知识(数论是重点QAQ),好题值得一做. BestCode ...

随机推荐

  1. sqlite3内存不断增加的原因

    数据库是这样设计的:用内存保存数据,以提高增删查改的速度,同时把数据写入磁盘,让数据落地. 如果不删除数据库里的数据,随着数据不断地添加到数据库,数据库越来越大,RES内存也越来越大. 见测试代码a. ...

  2. MySQL数据库的常用操作

    /*创建表*/ CREATE TABLE tb_test ( id ) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', name ) NOT NULL ...

  3. php number_format()保留小数点后几位

    [PHP_保留两位小数的相关函数] php保留两位小数并且四舍五入 Php代码   1     $num = 123213.666666;  2     echo sprintf("%.2f ...

  4. java 数组基本操作(一维)

    1.数组的声明: 数组类型  数组名[] 2.数组的表示方法 想使用数组中的值,可以使用索引来实现,数组是从0开始的,使用时格式为:数组名[i],比如 a[1],代表第二个值 在数组中要使用数组的长度 ...

  5. 安装opencv以及遇到的坑

    参考这篇文章: http://www.tuicool.com/articles/36fMnem 还是国外的文章靠谱: http://docs.opencv.org/master/dd/dd5/tuto ...

  6. linux poll 学习

    一.poll介绍 函数原型: #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout); struc ...

  7. Spring资源访问

    资源访问 1.Resource Jdk提供的访问资源的类并不能很好地满足各种底层的资源访问需求, 比如缺少从类路径或者web容器的上下文中获取资源的操作类. 鉴于此, Spring设计了一个Resou ...

  8. php获取 本月 本周 或者 下月 下周的 开始时间 结束时间

    <?php $now_time = time(); $date=date("Y-m-d",$now_time); function get_date($date,$t='d' ...

  9. php redis(2)

    [config_inc.php] <?php //APP的读账号 //$config['appServer']['servername'] = 'app.com'; $config['appSe ...

  10. C# Json 转对象

    C# public static UserInfo JsonConvertStringWeiXinInfo(string json) { return (UserInfo)Newtonsoft.Jso ...