扫雷(蓝桥杯)

题目描述

小明最近迷上了一款名为《扫雷》的游戏。其中有一个关卡的任务如下, 在一个二维平面上放置着 n 个炸雷,第 i 个炸雷 (xi , yi ,ri) 表示在坐标 (xi , yi) 处存在一个炸雷,它的爆炸范围是以半径为 ri 的一个圆。

为了顺利通过这片土地,需要玩家进行排雷。玩家可以发射 m 个排雷火箭,小明已经规划好了每个排雷火箭的发射方向,第 j 个排雷火箭 (xj , yj ,rj) 表示这个排雷火箭将会在 (xj , yj) 处爆炸,它的爆炸范围是以半径为 rj 的一个圆,在其爆炸范围内的炸雷会被引爆。同时,当炸雷被引爆时,在其爆炸范围内的炸雷也会被引爆。现在小明想知道他这次共引爆了几颗炸雷? 

你可以把炸雷和排雷火箭都视为平面上的一个点。一个点处可以存在多个炸雷和排雷火箭。当炸雷位于爆炸范围的边界上时也会被引爆。

输入格式

输入的第一行包含两个整数 n、m.

接下来的 n 行,每行三个整数 xi , yi ,ri,表示一个炸雷的信息。

再接下来的 m 行,每行三个整数 xj , yj ,rj,表示一个排雷火箭的信息。      

输出一个整数表示答案。

样例输入

2 1
2 2 4
4 4 2
0 0 5

样例输出

2

提示

示例图如下,排雷火箭 1 覆盖了炸雷 1,所以炸雷 1 被排除;炸雷 1 又覆盖了炸雷 2,所以炸雷 2 也被排除。

蓝桥杯2022年第十三届省赛真题扫雷

对于 40% 的评测用例:0 ≤ x, y ≤ 109 , 0 ≤ n, m ≤ 103 , 1 ≤ r ≤ 10. 

对于 100% 的评测用例:0 ≤ x, y ≤ 109 , 0 ≤ n, m ≤ 5 × 104 , 1 ≤ r ≤ 10. 

第一种

图的深度优先遍历,邻接表实现,  由于点数有1e5,那么遍历所有图上的点是否联通,需要O(n^2)也就是需要2.5e9,  明显会超时。(WA)

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#define int long long
using namespace std;
const int N=5e3+10;
bool st[N];
int n,m;
//存炸弹
struct node
{int x,y,r;
}stu[N];
vector<int>v[N];
//判断是否在这颗雷是否在这个圆
bool sqr(int x,int y,int xx,int yy,int r)
{if((xx-x)*(xx-x)+(yy-y)*(yy-y)<=r*r) return true;return false;
}
//连成一个连通图 雷在这个雷的范围内的就扩展
void add(int idx)
{int x=stu[idx].x,y=stu[idx].y,r=stu[idx].r;for(int i=1;i<=n;i++){if(i!=idx){if(sqr(x,y,stu[i].x,stu[i].y,r)) v[idx].push_back(i);}}
}
//看有多少颗符合要求的炸弹
int dfs(int idx)
{int sum=1;st[idx]=1;for(int i=0;i<v[idx].size();i++){int j=v[idx][i];if(!st[j]){st[j]=1;sum+=dfs(j);}}return sum;
}
//计算这颗排雷火箭能炸多少地雷
int dfs_Trave(int x,int y,int r)
{int sum=0;for(int i=1;i<=n;i++){if(sqr(stu[i].x,stu[i].y,x,y,r)){if(!st[i])sum+=dfs(i);}}return sum;
}
signed main()
{cin>>n>>m;for(int i=1;i<=n;i++){int x,y,r;cin>>x>>y>>r;stu[i]={x,y,r};}for(int i=1;i<=n;i++){add(i);}int sum=0;for(int i=1;i<=m;i++){int x,y,r;cin>>x>>y>>r;sum+=dfs_Trave(x,y,r);}cout<<sum<<endl;return 0;
}

    图的深度优先遍历,邻接表实现
    由于点数有1e5,那么遍历所有图上的点是否联通,需要O(n^2)也就是需要2.5e9,
    先把坐标按x轴从小到大排序,再按y轴从小到大排序
    当许多坐标扎堆在同一点的时候,应当去掉重复的点,只留下半径最大的点。
    不然建图的时候有O(n^2)的时间复杂度。
    AC版

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define int long long
using namespace std;
typedef pair<int,int>PII;
const int N=5e4+10;
bool st[N];
map<PII,int>mp;
int n,m,n1=0;
//存炸弹
struct node
{int x,y,r,cnt;bool operator < (node const & a) const{if(x!=a.x)return x<a.x;return y<a.y;}
}stu[N];
/*
bool cmp(node xx,node yy)
{if(xx.x==yy.x) return xx.y<yy.y;return xx.x<yy.x;
}*/
vector<int>v[N];
//判断是否在这颗雷是否在这个圆
bool sqr(int x,int y,int xx,int yy,int r)
{if((xx-x)*(xx-x)+(yy-y)*(yy-y)<=r*r) return true;return false;
}
//连成一个连通图 雷在这个雷的范围内的就扩展
void add(int idx)
{int x=stu[idx].x,y=stu[idx].y,r=stu[idx].r;for(int i=idx-1;i>=0;i--){if(r<(x-stu[i].x)) break;if(sqr(x,y,stu[i].x,stu[i].y,r)) v[idx].push_back(i);}for(int i=idx+1;i<=n1;i++){if(r<(stu[i].x-x)) break;if(sqr(x,y,stu[i].x,stu[i].y,r)) v[idx].push_back(i);}
}
//看有多少颗符合要求的炸弹
int dfs(int idx)
{int sum=stu[idx].cnt;st[idx]=1;for(int i=0;i<v[idx].size();i++){int j=v[idx][i];if(!st[j]){st[j]=1;sum+=dfs(j);}}return sum;
}
//计算这颗排雷火箭能炸多少地雷
int dfs_Trave(int x,int y,int r)
{node e1={x-r,y,r,1},e2={x+r,y,r,1};int l1=lower_bound(stu+1,stu+1+n1,e1)-stu;int r1=upper_bound(stu+1,stu+1+n1,e2)-stu;int sum=0;for(int i=l1;i<=r1;i++){if(sqr(stu[i].x,stu[i].y,x,y,r)){if(!st[i])sum+=dfs(i);}}return sum;
}
signed main()
{cin>>n>>m;for(int i=1;i<=n;i++){int x,y,r;cin>>x>>y>>r;int id=mp[{x,y}];if(id!=0){stu[id].r=max(stu[id].r,r);stu[id].cnt++;}else{int xx=1;n1++;stu[n1].x=x;stu[n1].y=y;stu[n1].r=r;stu[n1].cnt=1;mp[{x,y}]=n1;}}sort(stu+1,stu+1+n1);for(int i=1;i<=n1;i++){add(i);}int sum=0;for(int i=1;i<=m;i++){int x,y,r;cin>>x>>y>>r;sum+=dfs_Trave(x,y,r);}cout<<sum<<endl;return 0;
}

第二种

图的广度优先遍历,邻接表实现
    由于点数有1e5,那么遍历所有图上的点是否联通,需要O(n^2)也就是需要2.5e9,
    先把坐标按x轴从小到大排序,再按y轴从小到大排序
    当许多坐标扎堆在同一点的时候,应当去掉重复的点,只留下半径最大的点。
    不然建图的时候有O(n^2)的时间复杂度。

AC版

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<map>
#include<vector>
#include<set>
#define int long long
using namespace std;
typedef pair<int,int>PII;
const int N=5e4+10;
map<PII,int>mp;
bool st[N];
vector<int>v[N];
int n,m,n1;
struct node
{int x,y,r,num;bool operator < (node const &a) const{if(x!=a.x) return x<a.x;return y<a.y;}
}stu[N];
bool sqr(int x1,int y1,int x2,int y2,int r)
{if((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)<=r*r) return true;return false;
}
void add(int idx)
{int x=stu[idx].x,y=stu[idx].y,r=stu[idx].r;for(int i=idx-1;i>=0;i--){if(r<(x-stu[i].x)) break;if(sqr(x,y,stu[i].x,stu[i].y,r)) v[idx].push_back(i);}for(int i=idx+1;i<=n1;i++){if(r<(stu[i].x-x)) break;if(sqr(x,y,stu[i].x,stu[i].y,r)) v[idx].push_back(i);}
}
int bfs(int idx)
{int sum=stu[idx].num;queue<int>q;q.push(idx);st[idx]=1;while(q.size()){int t=q.front();q.pop();for(int i=0;i<v[t].size();i++){int j=v[t][i];if(!st[j]){st[j]=1;sum+=bfs(j);}}}return sum;
}
int bfs_Trave(int x,int y,int r)
{node e1={x-r,y,r,1},e2={x+r,y,r,1};int l1=lower_bound(stu+1,stu+1+n1,e1)-stu;int r1=upper_bound(stu+1,stu+1+n1,e2)-stu;int sum=0;for(int i=l1;i<=r1;i++){if(sqr(stu[i].x,stu[i].y,x,y,r)){if(!st[i])sum+=bfs(i);}}return sum;
}
signed main()
{cin>>n>>m;for(int i=1;i<=n;i++){int x,y,r;cin>>x>>y>>r;int xx=mp[{x,y}];if(xx!=0){stu[xx].r=max(stu[xx].r,r);stu[xx].num++;}else{n1++;stu[n1]={x,y,r,1};mp[{x,y}]=n1;}}   sort(stu+1,stu+1+n1);for(int i=1;i<=n1;i++){add(i);}int sum=0;for(int i=0;i<m;i++){int x,y,r;cin>>x>>y>>r;sum+=bfs_Trave(x,y,r);}cout<<sum<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/296791.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

链路追踪原理

分布式系统为什么需要链路追踪&#xff1f; 随着互联网业务快速扩展&#xff0c;软件架构也日益变得复杂&#xff0c;为了适应海量用户高并发请求&#xff0c;系统中越来越多的组件开始走向分布式化&#xff0c;如单体架构拆分为微服务、服务内缓存变为分布式缓存、服务组件通…

网络原理 - HTTP / HTTPS(3)——http响应

目录 一、认识 “状态码”&#xff08;status code&#xff09; 常见的状态码 &#xff08;1&#xff09;200 OK &#xff08;2&#xff09;404 Not Found &#xff08;3&#xff09;403 ForBidden &#xff08;4&#xff09;405 Method Not Allowed &#xff08;5&…

Linux系统Docker搭建Wiki.Js应用程序并结合cpolar实现公网访问内网知识库

文章目录 1. 安装Docker2. 获取Wiki.js镜像3. 本地服务器打开Wiki.js并添加知识库内容4. 实现公网访问Wiki.js5. 固定Wiki.js公网地址 不管是在企业中还是在自己的个人知识整理上&#xff0c;我们都需要通过某种方式来有条理的组织相应的知识架构&#xff0c;那么一个好的知识整…

Matlab梁单元有限元编程:铁木辛柯梁VS欧拉梁

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

我与C++的爱恋:内联函数,auto

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 ​ 一、内联函数 1.内联函数的概念 内联函数目的是减少函数调用的开销&#xff0c;通过将每个调用点将函数展开来实现。这种方法仅适用于那些函数体小、调用频繁的函数。 …

【JavaWeb】百度地图API SDK导入

百度地图开放平台 | 百度地图API SDK | 地图开发 (baidu.com) 登录注册&#xff0c;创建应用&#xff0c;获取AK 地理编码 | 百度地图API SDK (baidu.com) 需要的接口一&#xff1a;获取店铺/用户 所在地址的经纬度坐标 轻量级路线规划 | 百度地图API SDK (baidu.com) 需要的…

java-ssm-jsp-旅游景点数据库管理系统

java-ssm-jsp-旅游景点数据库管理系统 获取源码——》哔站搜&#xff1a;计算机专业毕设大全 获取源码——》哔站搜&#xff1a;计算机专业毕设大全

自定义树形筛选选择组件

先上效果图 思路&#xff1a;刚开始最上面我用了el-input&#xff0c;选择框里面内容用了el-inputel-tree使用&#xff0c;但后面发现最上面那个可以输入&#xff0c;那岂不是可以不需要下拉就可以使用&#xff0c;岂不是违背了写这个组件的初衷&#xff0c;所以后面改成div自定…

5.vector容器的使用

文章目录 vector容器1.构造函数代码工程运行结果 2.赋值代码工程运行结果 3.容量和大小代码工程运行结果 4.插入和删除代码工程运行结果 5.数据存取工程代码运行结果 6.互换容器代码工程运行结果 7.预留空间代码工程运行结果 vector容器 1.构造函数 /*1.默认构造-无参构造*/ …

StarRocks实战——携程火车票指标平台建设

目录 前言 一、早期OLAP架构与痛点 二、指标平台重构整体设计 2.1 指标查询过程 2.1.1 明细类子查询 2.1.2 汇总类子查询 2.1.3 “缓存” 2.2 数据同步 三、Starrocks使用经验分享 3.1 建表经验 3.2 数据查询 3.3 函数问题 四、查询性能大幅提升 五、 后续优化方…

C++实现二叉搜索树的增删查改(非递归玩法)

文章目录 一、二叉搜索树的概念结构和时间复杂度二、二叉搜索树的插入三、二叉搜索树的查找四、二叉搜索树的删除&#xff08;最麻烦&#xff0c;情况最多&#xff0c;一一分析&#xff09;3.1首先我们按照一般情况下写&#xff0c;不考虑特殊情况下4.1.1左为空的情况&#xff…

多线程--深入探究多线程的重点,难点以及常考点线程安全问题

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

C语言交换二进制位的奇数偶数位

基本思路 我们要先把想要交换的数的二进制位给写出来假如交换13的二进制位&#xff0c;13的二进制位是 0000 0000 0000 0000 0000 0000 0000 1101然后写出偶数位的二进制数&#xff08;偶数位是1的&#xff09; 1010 1010 1010 1010 1010 1010 1010 1010然后写出奇数位的二进…

2012年认证杯SPSSPRO杯数学建模C题(第一阶段)碎片化趋势下的奥运会商业模式全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 C题 碎片化趋势下的奥运会商业模式 原题再现&#xff1a; 从 1984 年的美国洛杉矶奥运会开始&#xff0c;奥运会就不在成为一个“非卖品”&#xff0c;它在向观众诠释更高更快更强的体育精神的同时&#xff0c;也在攫取着巨大的商业价值&#…

Spring Boot Mockito (三)

Spring Boot Mockito (三) 这篇文章主要是讲解Spring boot 与 Mockito 集成测试。 前期项目配置及依赖可以查看 Spring Boot Mockito (二) - DataJpaTest Spring Boot Mockito (一) - WebMvcTest Tag("Integration") SpringBootTest // TestMethodOrder(MethodOr…

go 指针和内存分配

定义 了解指针之前&#xff0c;先讲一下什么是变量。 每当我们编写任何程序时&#xff0c;我们都需要在内存中存储一些数据/信息。数据存储在特定地址的存储器中。内存地址看起来像0xAFFFF&#xff08;这是内存地址的十六进制表示&#xff09;。 现在&#xff0c;要访问数据…

程序员们应注意的行业特有的法律问题

大家好&#xff0c;我是不会魔法的兔子&#xff0c;是一枚执业律师&#xff0c;持续分享技术类行业项目风险及预防的问题。 一直以来兔子都在以大家做项目时候会遇到的风险问题做分享&#xff0c;最近有个念头一直挥之不去&#xff0c;就是要不要给我们广大的程序员们也分享一…

【接口】HTTP(1)|请求|响应

1、概念 Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;用于从万维网&#xff08;就是www&#xff09;服务器传输超文本到本地浏览器的传送协议。 HTTP协议是基于TCP的应用层协议&#xff0c;它不关心数据传输的细节&#xff0c;主要是用来规定客户端和…

【C++练级之路】【Lv.18】哈希表(哈希映射,光速查找的魔法)

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、哈希1.1 哈希概念1.2 哈希函数1.3 哈希冲突 二、闭散列2.1 数据类型2.2 成员变量2.3 默认成员函数2.…

【yy讲解PostCSS是如何安装和使用】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…