题意: 

      煤矿爆炸,每个煤矿有自己的x,y,d,d是他爆炸后会是d距离内的爆炸,每次输入一个爆炸的煤矿,问你这个煤矿爆炸会有多少个煤矿爆炸.

思路:

      爆炸的过程就是搜索的过程,被当前煤矿弄爆炸的煤矿可能继续去吧别的煤矿蹦爆炸,所以是搜索的过程,但直接搜会超时,所以各种STL,估计是数据水,不然我人感觉STL碰到坑人数据也得N^2,一样跪,思路是按照x离散化,1 2 3 3 4 离散化成1 2 3 4,然后每个点建立一个multiset,然后把y 和 id塞进去,按照y排序,像上面的那组,1 2 4的set里就一组数据,而3里面有两组,每次询问的时候,先找到x的范围,
x - d ,x + d,可以二分或者直接STL,然后再在找到的范围里找出满足条件的y,直接STL,这个地方二分会有点复杂,但如果想二分绝对可以,然后就这样广搜就行了....


#include<stdio.h>
#include<string.h>
#include<queue>
#include<set>
#include<algorithm> #define N 100000 + 100

using namespace
std; typedef struct NODE
{
int
y ,id;
NODE(int id_ ,int y_)
{

y = y_;
id = id_;
}
bool operator < (const
NODE &c) const
{
return
y < c.y;
}
}
NODE; typedef struct
{
int
x ,y ,d;
}
NOD; int abss(int a)
{
return
a < 0 ? -a : a;
}
NOD node[N];
int
X_hash[N] ,hash_n;
int
mark[N];
multiset<NODE>SET[N]; int BFS(int s)
{
int
ans = 0;
if(
mark[s]) return ans; mark[s] = 1;
queue<int>q;
q.push(s);
multiset<NODE>::iterator yl,yr,it;
while(!
q.empty())
{

ans ++;
int
tou ,xin;
tou = q.front();
q.pop();
int
xl = lower_bound(X_hash ,X_hash + hash_n ,node[tou].x - node[tou].d) - X_hash;
int
xr = upper_bound(X_hash ,X_hash + hash_n ,node[tou].x + node[tou].d) - X_hash;
for(int
i = xl ;i < xr ;i ++)
{
int
yy = node[tou].d - abss(node[tou].x - X_hash[i]);
yl = SET[i].lower_bound(NODE(0 ,node[tou].y - yy));
yr = SET[i].upper_bound(NODE(0 ,node[tou].y + yy));
for(
it = yl ;it != yr ;it++)
{
if(!
mark[it->id])
{

mark[it->id] = 1;
//ans ++;
q.push(it->id);
}
}

SET[i].erase(yl ,yr);
}
}
return
ans;
} int main ()
{
int
i ,j ,n ,m ,cas = 1;
while(~
scanf("%d" ,&n) && n)
{
for(
i = 0 ;i < n ;i ++)
{

scanf("%d %d %d" ,&node[i].x ,&node[i].y ,&node[i].d);
X_hash[i] = node[i].x;
}

sort(X_hash ,X_hash + n);
hash_n = unique(X_hash,X_hash + n) - X_hash;
for(
i = 0 ;i < hash_n ;i ++)
SET[i].clear();
for(
i = 0 ;i < n ;i ++)
{
int
id = lower_bound(X_hash ,X_hash + hash_n ,node[i].x) - X_hash;
//int xl = lower_bound(X_hash + 1 ,X_hash + hash_n + 1 ,node[tou].x - node[tou].d) - X_hash;
SET[id].insert(NODE(i ,node[i].y));
}

scanf("%d" ,&m);
printf("Case #%d:\n",cas ++);
memset(mark ,0 ,sizeof(mark));
for(
i = 1 ;i <= m ;i ++)
{
int
id;
scanf("%d" ,&id);
printf("%d\n" ,BFS(id-1));
}
}
return
0;
}

hdu4400 BFS+STL的更多相关文章

  1. 八数码问题(一) 暴力BFS + STL

    八数码问题是一个经典的人工智能问题.具体问题不累述了. 思路:由于存在多组测试数据,可以考虑“打表法“.所谓打表法,即枚举所有的初始情况,记录其到达终点的路径.而在这个题目中,顺序打表会调用很多次BF ...

  2. luogu题解P1032字串变换--BFS+STL:string骚操作

    题目链接 https://www.luogu.org/problemnew/show/P1032 分析 这题本来很裸的一个BFS,发现其中的字符串操作好烦啊.然后就翻大佬题解发现用STL中的strin ...

  3. POJ 1915 Knight Moves(BFS+STL)

     Knight Moves Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 20913   Accepted: 9702 ...

  4. Gym 100952F&&2015 HIAST Collegiate Programming Contest F. Contestants Ranking【BFS+STL乱搞(map+vector)+优先队列】

    F. Contestants Ranking time limit per test:1 second memory limit per test:24 megabytes input:standar ...

  5. TC-SRM391-div2-SortingGame(BFS,STL)

    Problem Statement for SortingGame Problem Statement In The Sorting Game, you are given a sequence co ...

  6. POJ 1915-Knight Moves (单向BFS &amp;&amp; 双向BFS 比)

    主题链接:Knight Moves 题意:8个方向的 马跳式走法 ,已知起点 和终点,求最短路 研究了一下双向BFS,不是非常难,和普通的BFS一样.双向BFS只是是从 起点和终点同一时候開始搜索,可 ...

  7. [C++]那些年被虐的STL

    首先很感谢**P1135奇怪的电梯 **[2.14补充:此题已被AC!然后将被我花式虐[From语]哈哈哈哈哈哈哈哈哈哈好嗨哟感觉人生已经到达了巅峰感觉人生已经到达了高潮]这道题了!在做这道题的我大致 ...

  8. LeetCode_算法及数据结构覆盖统计

    [输入]共计151道题的算法&数据结构基础数据 (见附录A) [输出-算法]其中有算法记录的共计 97道 ,统计后 结果如下  top3(递归,动态规划,回溯) 递归 动态规划 回溯 BFS ...

  9. 拼图游戏(8 puzzle)

    如图所示,这是一个九宫格(这倒是让我想起了小时候老师在黑板上教导我们的如何通过一系列的拼凑,将横行,竖行,以及斜行都拼到和相等),格子中有一个格子是空的,另外八个格子分别有数字1--8,我们的任务是将 ...

随机推荐

  1. fastjson 反弹shell

    目录 如下文章说得很不详细,只是用于记录我的步骤,初次利用的人,建议找别的博客文章学习. 准备一台公网服务器 cd test python -m SimpleHTTPServer 8888 javac ...

  2. POJ-1458(LCS:最长公共子序列模板题)

    Common Subsequence POJ-1458 //最长公共子序列问题 #include<iostream> #include<algorithm> #include& ...

  3. 任务4 PHP扩展模块安装

    /usr/local/php/bin/php -m //如何查看PHP加载了哪些模块 #cd  /usr/local/src #wget http://pecl.php.net/get/redis-2 ...

  4. WorkSkill 面试之 字节跳动一面

  5. 前端生成分享海报兼容H5和小程序

    ### 移动端分享海报生成 最近做项目需求是生成商品分享海报,并且保存到手机中要兼容H5和小程序<br> 与后端同学沟通后,海报在前端生成最省性能和有较好的交互体验,先看做好的效果

  6. Paint Chain HDU - 3980

    题目链接:https://vjudge.net/problem/HDU-3980 题意:由n个石头组成的环,每次只能取连续的M个,最后不能取得人输. 思路:这样就可以先把它变成链,然后在链上枚举取m个 ...

  7. 一键自签本地 TLSv3 多域名 SAN 域名证书工具 HTTPS(最新版 Chrome 浏览器策略测试通过)

    一键自动生成本地自签名SAN域名证书工具 原生OpenSSL生成自签名SAN CA域名(V3签名),在Linux.MacOS系统下签发测试通过. 用于一键快速生成开发和测试场景证书,内部平台授权和私有 ...

  8. P1049_装箱问题(JAVA语言)

    思路:动态规划的背包问题.使箱子剩余空间最小,也就是使箱内装的物品体积达到最大,我们可将物品的体积视为价值,然后按照01背包问题求解即可. //直接上模板 题目描述 有一个箱子容量为VV(正整数,0 ...

  9. Java系列教程-SpringMVC教程

    SpringMVC教程 1.SpringMVC概述 1.回顾MVC 1.什么是MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务 ...

  10. 安装并配置Docker(基于Ubuntu)

    安装并配置Docker(基于Ubuntu) 目录 安装并配置Docker(基于Ubuntu) 一.安装Docker 二.验证Docker是否安装成功 三.配置Docker加速器 3.1 创建daemo ...