题目大意:给出 nnn 个地雷和 mmm 个炸弹,都以 (x,y,r)(x,y,r)(x,y,r) 的形式给出,意义分别如下:

  1. 对于每个地雷,位于点 (x,y)(x,y)(x,y),爆炸后会波及半径为 rrr 的圆形区域
  2. 对于每个炸弹,会在点 (x,y)(x,y)(x,y) 爆炸,爆炸后会引爆半径为 rrr 的圆形区域内的地雷,随后地雷会 “连锁反应” 的爆炸

问使用过 mmm 个炸弹后,一共可以引爆多少个地雷

题目分析:(赛时读错题了,怪不得当时算复杂度的时候能多算一个 logloglog 出来)

最初的思想肯定是,先让可以“连锁反应”的地雷建立关系,这样引爆其中的一个地雷后,由“连锁反应”所引爆的地雷就不会被重复判断了,可以做到每个地雷至多被遍历一次。

需要发现一个很重要的细节就是,地雷引爆的关系是单向的,如果地雷 A 可以引爆地雷 B ,不一定能得出地雷 B 可以引爆地雷 A

所以整个“连锁反应”是一个有向图,不能使用并查集处理连通性。在建出有向图后索性直接用 dfs 暴力遍历即可,因为上面的思路已经保证了每个地雷至多遍历一次,所以 dfs 的复杂度是线性的

现在的问题转换为该如何快速建边,观察数据范围不难发现半径 rrr 给的特别小,所以可以将圆心用 map 映射一下,然后每次只需要遍历圆内的点尝试建边就好了

时间复杂度:O(n∗320∗logn)O(n*320*logn)O(n∗320∗logn),这里的 320320320 代表的是半径为 101010 的圆内的点数

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=5e4+100;
struct Point {int x,y,r;void input() {scanf("%d%d%d",&x,&y,&r);}
}p1[N],p2[N];
bool vis[N];
map<pair<int,int>,vector<int>>mp;
vector<int>node[N];
int dfs(int u) {if(vis[u]) {return 0;}vis[u]=true;int ans=1;for(auto v:node[u]) {ans+=dfs(v);}return ans;
}
int main() {int n,m;cin>>n>>m;for(int i=1;i<=n;i++) {p1[i].input();mp[{p1[i].x,p1[i].y}].push_back(i);}for(int i=1;i<=m;i++) {p2[i].input();}for(int i=1;i<=n;i++) {for(int dx=-10;dx<=10;dx++) {for(int dy=-10;dy<=10;dy++) {LL x=p1[i].x,y=p1[i].y;LL xx=x+dx,yy=y+dy;LL r=p1[i].r;if((x-xx)*(x-xx)+(y-yy)*(y-yy)<=r*r) {for(auto j:mp[{xx,yy}]) {node[i].push_back(j);}}}}}int ans=0;for(int i=1;i<=m;i++) {for(int dx=-10;dx<=10;dx++) {for(int dy=-10;dy<=10;dy++) {LL x=p2[i].x,y=p2[i].y;LL xx=x+dx,yy=y+dy;LL r=p2[i].r;if((x-xx)*(x-xx)+(y-yy)*(y-yy)<=r*r) {for(auto j:mp[{xx,yy}]) {ans+=dfs(j);}}}}}cout<<ans<<endl;return 0;
}

蓝桥杯 - 试题 H: 扫雷(思维)相关推荐

  1. 蓝桥杯 试题 算法训练 无聊的逗 C++ 详解 - 未完善

    题目: 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长的,他想知道在两根一样长的 ...

  2. 蓝桥杯试题 基础练习 十六进制转十进制

    蓝桥杯试题 基础练习 十六进制转十进制 C/C++实现 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出. ...

  3. 蓝桥杯试题 基础练习 BASIC-11 十六进制转十进制 JAVA——冲刺蓝桥杯第六天

    目录 前言 试题 基础练习 十六进制转十进制 要点 思路一:常规做法--进制转换 字符 循环 本题代码 思路二:简单做法,使用java自带的方法 本题代码 前言 进制转化包括这篇我写了三篇了,这篇没讲 ...

  4. 蓝桥杯研究生c语言试题答案,蓝桥杯试题_蓝桥杯 你有蓝桥杯历年的试题吗最好有参考答案啊 高职高专组C语言的 有的话麻烦你发给我 万分感谢_淘题吧...

    ❶ 蓝桥杯 你有蓝桥杯历年的试题吗最好有参考答案啊. 高职高专组C语言的 有的话麻烦你发给我 万分感谢 我有真题.但是老师没给答案 ❷ 为什么蓝桥杯试题集评测老是错 楼上的网友说的很简单,实际上因为每 ...

  5. Python 蓝桥杯试题 基础练习 特殊回文数

    Python 蓝桥杯试题 基础练习 特殊回文数 问题描述: 123321是一个非常特殊的数,它从左边读和从右边读是一样的. 输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于 ...

  6. 蓝桥杯试题 数列排序

    蓝桥杯试题 数列排序 问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列.1<=n<=200 输入格式 第一行为一个整数n. 第二行包含n个整数,为待排序的数,每个整数的绝对 ...

  7. Python 蓝桥杯试题 基础练习 数列排序

    Python 蓝桥杯试题 基础练习 数列排序 题目描述: 问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列.1<=n<=200 输入格式 第一行为一个整数n. 第二行包含n ...

  8. 蓝桥杯试题 基础练习 数列特征python

    蓝桥杯试题 基础练习 数列特征python 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给出n个数,找出这n个数的最大值,最小值,和. 输入格式 第一行为整数n,表示数的个数. ...

  9. 蓝桥杯 试题 算法训练 无聊的逗 C++ 详解

    题目: 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长的,他想知道在两根一样长的 ...

最新文章

  1. 《复联4》的这波操作,其实是在灭 bug
  2. “万维网之父”发文阐述其下一个网络时代:将数据与应用分离,互联网去中心化正在路上...
  3. js插件---webuploader 使用(lavarel中使用)
  4. Java实现Excel导入数据库,数据库中的数据导入到Excel
  5. mlecms v2.2版权
  6. Erlang中的record与宏
  7. HDFS中JAVA API的使用
  8. android svg按钮图标下载,安卓android中小图标使用优化(svg矢量图与iconfiy)
  9. Pascal VOC 2012数据集下载(速度很快)
  10. python插件安装包_Python的插件安装
  11. 法向量变换矩阵的推导
  12. 2021年1月PHP面试题总结
  13. postgresql chm格式手册
  14. xp启用计算机共享打印机,xp系统怎么共享打印机|win7怎么连接xp共享打印机
  15. idou老师教你学istio2:监控能力介绍
  16. 我用FreeMind 思维导图工具
  17. ECCV2018 | 论文阅读CornerNet: Detecting Objects as Paired Keypoints
  18. 轻量级分布式事务-自定义多数据源事务注解
  19. Please contact your system administrator. Add correct host key in /Users/***/.ssh/known_hosts
  20. 通过 irp 请求包删除文件

热门文章

  1. 网络协议基础:“工作中模模糊糊的概念,这次终于理顺了!”
  2. Redis操作key相关API
  3. Network Namespace
  4. 微信支付 - 构建商户端支付成功的回调接口
  5. 确认订单 - 提交并且接受订单信息
  6. 字符流读数据的2种方式
  7. Spring版本特性:Spring各个版本引入了哪些新特性?
  8. BufferedInputStream_字节缓冲输入流
  9. 定时任务四种实现方式
  10. Request_获取请求体数据