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的更多相关文章
- 八数码问题(一) 暴力BFS + STL
八数码问题是一个经典的人工智能问题.具体问题不累述了. 思路:由于存在多组测试数据,可以考虑“打表法“.所谓打表法,即枚举所有的初始情况,记录其到达终点的路径.而在这个题目中,顺序打表会调用很多次BF ...
- luogu题解P1032字串变换--BFS+STL:string骚操作
题目链接 https://www.luogu.org/problemnew/show/P1032 分析 这题本来很裸的一个BFS,发现其中的字符串操作好烦啊.然后就翻大佬题解发现用STL中的strin ...
- POJ 1915 Knight Moves(BFS+STL)
Knight Moves Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 20913 Accepted: 9702 ...
- 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 ...
- TC-SRM391-div2-SortingGame(BFS,STL)
Problem Statement for SortingGame Problem Statement In The Sorting Game, you are given a sequence co ...
- POJ 1915-Knight Moves (单向BFS && 双向BFS 比)
主题链接:Knight Moves 题意:8个方向的 马跳式走法 ,已知起点 和终点,求最短路 研究了一下双向BFS,不是非常难,和普通的BFS一样.双向BFS只是是从 起点和终点同一时候開始搜索,可 ...
- [C++]那些年被虐的STL
首先很感谢**P1135奇怪的电梯 **[2.14补充:此题已被AC!然后将被我花式虐[From语]哈哈哈哈哈哈哈哈哈哈好嗨哟感觉人生已经到达了巅峰感觉人生已经到达了高潮]这道题了!在做这道题的我大致 ...
- LeetCode_算法及数据结构覆盖统计
[输入]共计151道题的算法&数据结构基础数据 (见附录A) [输出-算法]其中有算法记录的共计 97道 ,统计后 结果如下 top3(递归,动态规划,回溯) 递归 动态规划 回溯 BFS ...
- 拼图游戏(8 puzzle)
如图所示,这是一个九宫格(这倒是让我想起了小时候老师在黑板上教导我们的如何通过一系列的拼凑,将横行,竖行,以及斜行都拼到和相等),格子中有一个格子是空的,另外八个格子分别有数字1--8,我们的任务是将 ...
随机推荐
- Apache配置 3.域名跳转
(1)介绍 当我们变更网站域名或者申多个域名指向一个网站的时候,这个时候我们就会用到域名跳转. (2)配 设置不是以111.com开头的网站都跳转到111.com上. 置 配置 设置不是以111.co ...
- 如何强制删除一个apk
有些apk安装完后无法卸载,现在收集了一些方法,以及个人的一些手段. 1. 假设该app名为ketech,安装包名为ketech.apk. 2. 查看/data/app里面是否有名称包含ketech的 ...
- Go语言学习笔记——Go语言的指针
Go具有指针.指针保存了变量的内存地址. 类型*T是指向类型T的值得指针.其零值是nil var p *int &符号会生成一个指向其作用对象的指针 i:=42 P=&i *符号表示指 ...
- 自然语言处理(NLP)知识结构总结
自然语言处理知识太庞大了,网上也都是一些零零散散的知识,比如单独讲某些模型,也没有来龙去脉,学习起来较为困难,于是我自己总结了一份知识体系结构,不足之处,欢迎指正.内容来源主要参考黄志洪老师的自然语言 ...
- Webpack 学习笔记(1) 开始
目录 参考资料 1. 基础设定 2. 创建一个包 3. 使用配置文件完成打包命令 4. 使用 NPM Scripts 完成打包命令 参考资料 Getting Started | Webpack web ...
- 简单ping确定网络故障
1.ping localhost (127.0.0.1) 目的:确定TCP/IP有无问题 2.ping本机地址 用来检测网卡驱动有无问题 如何获取本机地址? win+r cmd 输入ipconfig/ ...
- 2018ICPC 南京Problem J. Prime Game
题目: 题意:给出一个序列a1,⋯,ana1,⋯,an.fac(l,r)fac(l,r)为mul(l,r)mul(l,r)中不同质因数的个数. 请计算: ∑i=1n∑j ...
- 7、Spring教程之使用注解开发
1.说明 在spring4之后,想要使用注解形式,必须得要引入aop的包 <dependency> <groupId>org.springframework</group ...
- 用程序员的思维了解Filecoin
程序员接触一个新技术惯用步骤: 先搜索引擎搜索一波,找个最简单的解释.如果有了个大概的概念,就前往2.否则循环1->1->1...直到有个大概的概念为止. 上官网跑一遍. 各种论坛社区溜达 ...
- ARFoundation - touch point坐标点测试
ARFoundation - touch point坐标点测试 本文目的是为了看一下Android手机上touch之后,对应的点相关信息,主要包括: 点的屏幕坐标,以左下角为原点: 点的viewpor ...