hdu4400 BFS+STL
题意:
煤矿爆炸,每个煤矿有自己的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相关推荐
- 吴昊品游戏核心算法 Round 9 —— 黑白棋AI系列之西洋跳棋(第二弹)(双向BFS+STL)(POJ 1198)...
接上回,如图所示,这是黑白棋的一个变种,Solitaire也是一种在智能手机上普遍存在的一种游戏.和翻转棋(Flip Game)一样,西洋跳棋(Solitaire)也没有正统的黑白棋(奥赛罗,又称Ot ...
- 御坂美琴(入门bfs+STL)
御坂美琴 misaka是呱太爷爷的小粉丝,呱太爷爷有一句话说的好:"一尺之棰,日取其半,万世不竭". misaka现在有 n 个呱太玩偶放在一堆,每一次操作,misaka会选择当前 ...
- 【BFS】【图论】极其简单的最短路问题
题目: 小C终于被小X感动了,于是决定与他看电影,然而小X距离电影院非常远,现在假设每条道路需要花费小X的时间为1,由于有数以万计的好朋友沿路祝贺,导致小X在通过某些路不得不耗费1的时间来和他们聊天, ...
- 拼图游戏(8 puzzle)
如图所示,这是一个九宫格(这倒是让我想起了小时候老师在黑板上教导我们的如何通过一系列的拼凑,将横行,竖行,以及斜行都拼到和相等),格子中有一个格子是空的,另外八个格子分别有数字1--8,我们的任务是将 ...
- 刷算法题遇到的c++知识点(持续更新)
文章目录 STL queuen stack map set vector string类型 c++11的新特性 sort函数 其他 二维bfs STL queuen queue< int > ...
- 《光劍一字經》慢字經,心字经
「慢」:專注一件事,做到精湛 很多人勤奮但是卻很難成功,原因就是他們做得多但是不夠精通.現在,能夠專注於一件事,將其做到精湛的人很少. 而做好事情的捷徑就是一次只做一件事.巴菲特一生只做了一件事,就是 ...
- 吴昊品游戏核心算法 Round 17 —— 吴昊教你玩拼图游戏(8 puzzle)
如图所示,这是一个九宫格(这倒是让我想起了小时候老师在黑板上教导我们的如何通过一系列的拼凑,将横行,竖行,以及斜行都拼到和相等),格子中有一个格子是空的,另外八个格子分别有数字1--8,我们的任务是将 ...
- Luogu1443 马的遍历【STL通俗BFS】
喜闻乐见当做BFS的STL模板做了 qwq我这样的蒟蒻也就只能发发模板题 #include<cstdio> #include<cstring> #include<cmat ...
- 求连通分量(DFS)(BFS)(STL)
文章目录 求连通分量 1.深搜(邻接矩阵) 2.深搜(邻接表) 3.广搜(邻接矩阵) 4.广搜(邻接表) 5.STL(邻接表) 谢谢欣赏 求连通分量 Description 求一个图的连通分量 Inp ...
最新文章
- 《从零开始学Swift》学习笔记(Day 47)——final关键字
- 英特尔CEO:英特尔下一个市场将是无人驾驶汽车
- bootstrap 解决弹出窗口(modal) 常见问题
- 计算机专业英语宋,机电一体化专业英语宋主民章.pdf
- 【原】人生的程序公式
- 2018年1月问答系统综述
- 赢在电子商务网站制作与营销:B2C版
- 解决ios手机页面overflow scroll滑动很卡的问题
- 陈纪修老师《数学分析》 第03章:函数极限与连续函数 笔记
- 【python】matplotlib绘图显示不了中文,且没有SimHei、FangSong等字体
- 最全办公室租赁技巧,让你找到心仪的办公室
- 学会Apache网页与安全的优化,让你的技术更加胜人一筹!(网页压缩与缓存、隐藏版本信息与配置防盗链)
- 浅谈链表的构建,next到底是什么
- tungsten-replicator安装
- 语言-英语翻译(edx-datascientist 1.2-1.4)
- android驱动开发从零到一
- 【内网安全】域横向CSMSF联动及应急响应初始
- Spring中的@NumberFormat注解
- SAP HANA Procedure的Odata更新(POST)表操作
- 不要轻易使用第三方软件搬运C盘大文件