http://acm.hdu.edu.cn/showproblem.php?pid=4400

题意:

在笛卡尔坐标中有多个炸弹,每个炸弹有一个坐标值和一个爆炸范围。现在有多次操作,每次引爆一个炸弹,问每次操作会有多少个炸弹爆炸。

思路:

需要注意的是一个炸弹爆炸后会引起别的炸弹爆炸,然后别的炸弹爆炸后又会引起别的炸弹爆炸。

可以考虑bfs,但是必须需要优化,首先对x坐标进行离散化,然后将该坐标的y值和id值(第几个炸弹)存入multiset中,不同的x存入不同的multiset中。当我们进行寻找时,首先可以确定x的范围,当确定了x的范围之后,对于该x值我们又可以确定y的范围,这样只需要在multiset中进行二分查找即可。不得不说这个做法实在是太妙了。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<set>
#include<queue>
#include<cstring>
using namespace std;
const int maxn = +; int n, num;
int x[maxn],y[maxn],d[maxn],b[maxn];
bool del[maxn]; struct node
{
int y,id;
node(int y, int id):y(y),id(id){}
bool operator< (const node& rhs) const
{
return y<rhs.y;
}
}; multiset<node> s[maxn];
multiset<node>::iterator ly, ry, it; void solve()
{
priority_queue<int> q;
memset(del,false,sizeof(del));
int m; scanf("%d",&m);
while(m--)
{
int t; scanf("%d",&t); t--;
if(del[t]) {puts("");continue;}
while(!q.empty()) q.pop();
q.push(t);
del[t] = true;
int ans = ;
while(!q.empty())
{
ans++;
t = q.top(); q.pop();
int lx = lower_bound(b,b+num,x[t]-d[t])-b;
int rx = upper_bound(b,b+num,x[t]+d[t])-b;
for(int i=lx;i<rx;i++)
{
int dis = d[t]-abs(x[t]-b[i]);
ly = s[i].lower_bound(node(y[t]-dis,));
ry = s[i].upper_bound(node(y[t]+dis,));
for(it=ly;it!=ry;it++)
{
if(!del[it->id])
{
del[it->id] = true;
q.push(it->id);
}
}
s[i].erase(ly,ry);
}
}
printf("%d\n",ans);
}
} int main()
{
//freopen("in.txt","r",stdin);
int kase = ;
while(~scanf("%d",&n) && n!=)
{
printf("Case #%d:\n",++kase);
for(int i=;i<n;i++)
{
scanf("%d%d%d",&x[i],&y[i],&d[i]);
b[i] = x[i];
}
sort(b,b+n);
num = unique(b,b+n)-b;
for(int i=;i<n;i++) s[i].clear();
for(int i=;i<n;i++)
{
int tmp = lower_bound(b,b+num,x[i])-b;
s[tmp].insert(node(y[i],i));
}
solve();
}
return ;
}

HDU 4400 Mines(好题!分两次计算距离)的更多相关文章

  1. hdu 4400 Mines(离散化+bfs+枚举)

    Problem Description Terrorists put some mines in a crowded square recently. The police evacuate all ...

  2. ul和li实现分两列(多列)布局显示

    简单语句实现DIV+CSS分两列(多列)布局显示 <style type="text/css"> .my ul { width: 210px; } .my li { w ...

  3. linux安装mysql服务分两种安装方法:

    linux安装mysql服务分两种安装方法: ①源码安装,优点是安装包比较小,只有十多M,缺点是安装依赖的库多,安装编译时间长,安装步骤复杂容易出错: ②使用官方编译好的二进制文件安装,优点是安装速度 ...

  4. 【python】【补】Leetcode每日一题-合并两个有序数组

    [python]Leetcode每日一题-合并两个有序数组 [题目描述] 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组 ...

  5. 鸿蒙内核源码分析(位图管理篇) | 谁能一分钱分两半用 | 百篇博客分析OpenHarmony源码 | v19.03

    百篇博客系列篇.本篇为: v19.xx 鸿蒙内核源码分析(位图管理篇) | 谁能一分钱分两半用 | 51.c.h .o 先看四个宏定义,进程和线程(线程就是任务)最高和最低优先级定义,[0,31]区间 ...

  6. POJ C程序设计进阶 编程题#1:计算矩阵边缘之和

    编程题#1:计算矩阵边缘元素之和 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB ...

  7. python的N个小功能(文本字段对应数值,经纬度计算距离,两个时间点计算时间间隔)

    案例1 >>> import pandas as pd >>> df=pd.DataFrame({'A':[1,2,3],'B':[1,2,3],'C':[1,2, ...

  8. 两种计算Java对象大小的方法

    之前想研究一下unsafe类,碰巧在网上看到了这篇文章,觉得写得很好,就转载过来.原文出处是: http://blog.csdn.net/iter_zc/article/details/4182271 ...

  9. python 练习题:小明的成绩从去年的72分提升到了今年的85分,请计算小明成绩提升的百分点

    # -*- coding: utf-8 -*- # 小明的成绩从去年的72分提升到了今年的85分,请计算小明成绩提升的百分点,并用字符串格式化显示出'xx.x%',只保留小数点后1位. s1 = 72 ...

随机推荐

  1. GUI常用对象的属性

    %常用对象的属性 %.figure %hf=figure; %get(hf); %改变颜色 set Color %set(hf,'Color','w'); %去掉默认的菜单 Menubar %set( ...

  2. 和風いろはちゃんイージー / Iroha and Haiku (ABC Edition) (水水)

    题目链接:http://abc042.contest.atcoder.jp/tasks/abc042_a Time limit : 2sec / Memory limit : 256MB Score ...

  3. easyui datagrid 遇到的坑 cannot read property ·· pageNum bug and so on

    1 本人刚刚接到一个bug,就是初始化时若设置了datagrid到指定页数,点击下一页显示不对,4 --> ‘4’+1=41的字符串形式,再点击超出页码范围直接到最后一页: 原因:因为 page ...

  4. PHP优化加速之Opcache使用总结

    PHP优化加速之Opcache使用总结: Opcache是一种通过将解析的PHP脚本预编译的字节码存放在共享内存中来避免每次加载和解析PHP脚本的开销,解析器可以直接从共享内存读取已经缓存的字节码,从 ...

  5. fjwc2019 D1T2 原样输出(后缀自动机+dp)

    #179. 「2019冬令营提高组」原样输出 暴力对每个串建后缀自动机,然后暴力枚举每个自动机的子串.可以拿到部分分. 然鹅我们可以把每个后缀自动机连起来. 我们知道,后缀自动机是用最少的点(空间)表 ...

  6. Java泛型中的标记符

    E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number(数值类型) ? -  表示不确 ...

  7. Pycharm创建Django项目并访问Django

    Pycharm创建Django项目并访问Django 一.Django插件 如果没有Django插件,需要先安装Django插件. 1,首先点击Default Settings,打开设置页面: 2,打 ...

  8. Linux 安装本地 yum源

    放入Centos6.4的镜像光盘或找到镜像文件 [root]#mount /dev/cdrom  /media/cdrom  #挂载本地镜像 [root]#rm -rf /etc/yum.repo.d ...

  9. linux下 GCC编译链接静态库&动态库

    静态库 有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库, 我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后 ...

  10. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem A - B

    Array of integers is unimodal, if: it is strictly increasing in the beginning; after that it is cons ...