题意:一条直线上有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. golang的helloworld

    新建源码文件hello.go mkdir -p /work/goTest/ cd /work/goTest/ vim hello.go 编码hello.go文件: package main impor ...

  2. 对于改善 MySQL 数据装载操作有效率的方法是怎样

    多时候关心的是优化SELECT 查询,因为它们是最常用的查询,而且确定怎样优化它们并不总是直截了当.相对来说,将数据装入数据库是直截了当的.然而,也存在可用来改善数据装载操作效率的策略,其基本原理如下 ...

  3. 【PHP设计模式 08_CeLue.php】策略模式

    <?php /** * [策略模式]----和"简单工厂"模式很相似 * 根据不同运算符计算两个数的运算结果 * 常规方式就是判断运算符然后进行if...else的操作 * ...

  4. Android实现推送方式解决方案(转)

    本文介绍在Android中实现推送方式的基础知识及相关解决方案.推送功能在手机开发中应用的场景是越来起来了,不说别的,就我们手机上的新闻客户端就时不j时的推送过来新的消息,很方便的阅读最新的新闻信息. ...

  5. YTU 2986: 删除区间内的元素(线性表)

    2986: 删除区间内的元素(线性表) 时间限制: 1 Sec  内存限制: 2 MB 提交: 8  解决: 3 题目描述 若一个线性表L采用顺序存储结构,其中元素都为整数.设计一个算法,删除元素值在 ...

  6. WCF自定义地址路由映射(不用svc文件)

    一般在创建WCF服务时会用Serivce.svc文件访问,地址如:http://localhost/applicationname/Serivce.svc/Name 现在用路由映射成:http://l ...

  7. PHP处理数据--excel与scv与json

    今天要处理两个excel.两个循环嵌套验证重复性.所以写了几个函数来处理20亿次的数据量. 一.把excel读出来,保存为json.利用phpexcel插件: <?php header(&quo ...

  8. Codeforces Round #368 (Div. 2) B

    Description Masha wants to open her own bakery and bake muffins in one of the n cities numbered from ...

  9. ADO,NET 实体类 和 数据访问类

    啥也不说,看代码. --SQl中 --建立ren的数据库,插入一条信息 create database ren go use ren go create table xinxi ( code ) pr ...

  10. Xcode的Architectures和Valid Architectures的区别,

    登录 | 注册 ys410900345的专栏 目录视图摘要视图订阅 学院APP首次下载,可得50C币!     欢迎来帮助开源“进步”     当讲师?爱学习?投票攒课吧     CSDN 2015博 ...