扫雷(蓝桥杯)

题目描述

小明最近迷上了一款名为《扫雷》的游戏。其中有一个关卡的任务如下, 在一个二维平面上放置着 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;
}

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;
}

 

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

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

相关文章

19-错误处理(下):如何设计错误包?

业界有很多优秀的、开源的错误包可供选择&#xff0c;例如Go标准库自带的errors包、github.com/pkg/errors包。 错误包需要具有哪些功能&#xff1f; 在我看来&#xff0c;至少需要有下面这六个功能&#xff1a; 首先&#xff0c;应该能支持错误堆栈。 假设保存在bad.go文件…

【MySQL笔记】SELECT COUNT(*) 的时候,加不加where条件有差别吗?

文章目录 前言实验结论 前言 这部分很多帖子都只在问题里罗列下&#xff0c;好像也没详细解答 其实就是跟InnoDB优先走二级索引的优化有关&#xff0c;前面也提到了”优化的前提是查询语句中不包含where条件和group by条件“ 还不太了解这个优化的朋友可以看上一篇帖子 实验 …

如何使用剪映专业版剪辑视频

1.操作界面功能介绍 2.时间线的使用 拖动前端后端缩减时长&#xff0c;有多个素材可以拖动调节前后顺序拼接。 分割视频 删除

CentOs7.9中修改Mysql8.0.28默认的3306端口防止被端口扫描入侵

若你的服务器被入侵&#xff0c;可以从这些地方找到证据&#xff1a; 若有上述信息&#xff0c;300%是被入侵了&#xff0c;重装服务器系统以后再重装Mysql数据库&#xff0c;除了设置一个复杂的密码以外&#xff0c;还需要修改默认的Mysql访问端口&#xff0c;逃避常规端口扫描…

目标检测——工业安全生产环境违规使用手机的识别

一、重要性及意义 首先&#xff0c;工业安全生产环境涉及到许多复杂的工艺和设备&#xff0c;这些设备和工艺往往需要高精度的操作和严格的监管。如果员工在生产过程中违规使用手机&#xff0c;不仅可能分散其注意力&#xff0c;降低工作效率&#xff0c;更可能因操作失误导致…

1688采集商品信息 马帮 店小秘 芒果采集API接口 java php

1688详情API接口是一种基于开放平台的应用程序接口&#xff0c;它能够实现与1688平台的数据交互&#xff0c;让商家能够更加方便地获取商品详情、库存信息、价格变动等重要数据。通过这一接口&#xff0c;商家可以实时掌握市场动态&#xff0c;快速响应消费者需求&#xff0c;从…

Leetcode 617. 合并二叉树

心路历程&#xff1a; 看到两颗二叉树的问题&#xff0c;第一反应想到了同频遍历&#xff0c;然后每一步创建新的结点&#xff0c;虽然也写出来了但是代码比较长&#xff0c;而且空间复杂度比较高&#xff0c;好处是没有修改原始的两个二叉树的结果。 后来看了网上的解答&…

探索父进程和子进程

文章目录 通过系统调用查看进程PID父进程、子进程 通过系统调用创建进程-fork初识为什么fork给父进程返回子进程的PID&#xff0c;给子进程返回0fork函数如何做到返回两个值一个变量为什么同时会有两个返回值&#xff1f;bash总结 通过系统调用查看进程PID getpid()函数可以获…

SpringBoot 集成分布式任务调度 XXL-JOB【保姆级上手】

文章目录 XXL-JOB 介绍分布式任务调度XXL-JOB 概述 快速入门下载源码初始化调度数据库编译源码调度中心调度中心介绍配置调度中心部署调度中心集群部署调度中心&#xff08;可选&#xff09;Docker 镜像方式搭建调度中心&#xff08;可选&#xff09; 执行器执行器介绍添加依赖…

动态系统的稳定性【3】-庞加莱截面

引言&#xff1a; 非线性动力学在众多领域中都得到了较广泛的应用&#xff0c;但各领域研究方向有所不同。在论文中如果涉及到方程的非线性&#xff0c;总会需要定性的分析一下&#xff0c;由于方法比较类似&#xff0c;所以常常也可以参阅别的领域的非线性分析相关的方法或者好…

抖音小店没达人带货?学会这几个话术!精准拿捏!全是干货快收藏

哈喽~我是电商月月 一说抖音小店如何寻找达人&#xff0c;了解过相关知识的人都会背了&#xff01; 精选联盟的选品广场&#xff0c;达人广场&#xff0c;招商团长&#xff01; 但操作一学就会&#xff0c;动手就废&#xff0c;商品也挂佣金了&#xff0c;达人也打招呼了&am…

7、Qwen-7B 部署实践

1、Qwen&#xff08;通义千问&#xff09;介绍 Qwen&#xff08;通义千问&#xff09;由阿里云团队研发&#xff0c;其训练数据覆盖多语言&#xff0c;但主要以中文和英文为主。Qwen的系列模型主要有两类&#xff0c;一类是基座模型Qwen&#xff0c;所谓基座模型&#xff0c;指…