#扫描线,并查集,切比雪夫距离#洛谷 5193 [TJOI2012]炸弹
题目
在平面上有 \(n\) 个炸弹 \([1 \ldots n]\) ,
每个炸弹的爆炸范围是 \(|x-x_i|+|y-yi| \leq R\)
如果某个炸弹爆炸了,那么它将引燃它范围内的所有炸弹。
求出至少引燃多少炸弹才能使得所有炸弹都爆炸。
分析
如果把所有可能爆炸的边连起来那么就转换成求无向图的连通块个数,这个用并查集实现,
曼哈顿距离不好做,考虑把它转换成切比雪夫距离
但是建边可能有\(O(n^2)\)条,考虑优化建边,将所有点按\(x\)坐标排序,
那么对于每个点只要考虑对纵坐标的前驱后继点相连那么连通块的点都能够相连
用\(map\)维护即可
代码
#include <cstdio>
#include <cctype>
#include <algorithm>
#include <map>
#define rr register
using namespace std;
const int N=100011;
struct rec{int x,y;}a[N];
int n,R,f[N],ans; map<int,int>uk;
map<int,int>::iterator it;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
bool cmp(rec x,rec y){return x.x<y.x||(x.x==y.x&&x.y<y.y);}
inline signed getf(int u){return f[u]==u?u:f[u]=getf(f[u]);}
inline void uni(int x,int y){
rr int fa=getf(x),fb=getf(y);
if (fa!=fb) f[fa]=fb,--ans;
}
signed main(){
ans=n=iut(),R=iut();
for (rr int i=1;i<=n;++i){
rr int x=iut(),y=iut();
a[i]=(rec){x+y,x-y},f[i]=i;
}
sort(a+1,a+1+n,cmp);
for (rr int i=1,j=1;i<=n;++i){
for (;a[j].x+R<a[i].x;++j)
if (uk[a[j].y]==j) uk.erase(a[j].y);
it=uk.lower_bound(a[i].y);
if (it!=uk.end()){
if (a[i].y+R>=it->first) uni(it->second,i);
}
if (it!=uk.begin()){
--it;
if (it->first+R>=a[i].y) uni(it->second,i);
}
uk[a[i].y]=i;
}
return !printf("%d",ans);
}
#扫描线,并查集,切比雪夫距离#洛谷 5193 [TJOI2012]炸弹的更多相关文章
- 边带权并查集 学习笔记 & 洛谷P1196 [NOI2002] 银河英雄传说 题解
花了2h总算把边带权并查集整明白了qaq 1.边带权并查集的用途 众所周知,并查集擅长维护与可传递关系有关的信息.然而我们有时会发现并查集所维护的信息不够用,这时"边带权并查集"就 ...
- 【CF471E】MUH and Lots and Lots of Segments 扫描线+并查集+线段树+set
[CF471E]MUH and Lots and Lots of Segments 题意:给你平面上n条水平或竖直的,端点在整点处的线段.你需要去掉一些线段的一些部分,使得剩下的图形:1.连通,2.无 ...
- POJ1703带权并查集(距离或者异或)
题意: 有两个黑社会帮派,有n个人,他们肯定属于两个帮派中的一个,然后有两种操作 1 D a b 给出a b 两个人不属于同一个帮派 2 A a b 问a b 两个人关系 输出 同一个帮派 ...
- 洛谷2685 [TJOI2012]桥
[TJOI2012]桥 题目大意:给定一无向图,求删除一条边后1到n最短路的最大值,以及方案数. 做法:我们先从1为起点.从n为起点跑两边dij,获得每一个点到起点1.终点n的最短距离,其实距离和边权 ...
- 洛谷 - P2280 - 激光炸弹
https://www.luogu.org/problemnew/show/P2280 二维前缀和差分的模板题.注意学习二维前缀和的求法,不用又down又right的. #include<bit ...
- 浅谈并查集&种类并查集&带权并查集
并查集&种类并查集&带权并查集 前言: 因为是学习记录,所以知识讲解+例题推荐+练习题解都是放在一起的qvq 目录 并查集基础知识 并查集基础题目 种类并查集知识 种类并查集题目 并查 ...
- bzoj 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(set+并查集)
Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的 时候有一个独一无二的位置坐标Xi,Yi( ...
- hdu 3234 Exclusive-OR (并查集)
Problem - 3234 题意不难理解,就是给出一些断言,以及一些查询,回答查询或者在找到断言矛盾以后沉默不做任何事. 这题其实就是一个并查集的距离存储问题,只要记录并查集元素的相对值以及绝对值就 ...
- [洛谷P1196][NOI2002]银河英雄传说 - 带偏移量的并查集(1)
Description 公元五八〇一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发 ...
- 洛谷OJ P1196 银河英雄传说(带权并查集)
题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...
随机推荐
- .Net Code Excel 文件导入
第一步 下载NuGet NPOI包 /// <summary> /// 将excel文教导入到订单表 /// </summary> /// <param name=&qu ...
- 关于json序列化时报错json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
1.今天在写客户端与服务端交互的程序的时候,发现了一个问题 客户端代码 #客户端程序主要是发送注册请求/登录请求给服务端,服务端接收响应后回应对应的应答给客户端,客户端接收响应后,然后做一些操作 # ...
- mysql安装及增删改查操作---day35
# ### mysql ''' 命令可以用tab来补全 d: D:\>cd MySQL5.7 D:\>cd D:\MySQL5.7\mysql-5.7.25-winx64\bin 直接切换 ...
- django中使用celery异步发送邮件
申请163网易发送邮件权限 在django中settings配置文件 #配置邮件服务器 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBac ...
- .NET开源功能强大的串口调试工具
前言 今天大姚给大家分享一款.NET开源的.功能强大的串口调试工具:LLCOM. 工具介绍 LLCOM是一个.NET开源的.功能强大的串口调试工具.支持Lua自动化处理.串口调试.串口监听.串口曲线. ...
- RocketMQ(8) 消费幂等
1 什么是消费幂等 当出现消费者对某条消息重复消费的情况时,重复消费的结果与消费一次的结果是相同的,并且多次消 费并未对业务系统产生任何负面影响,那么这个消费过程就是消费幂等的. 幂等:若某操作执行多 ...
- 基于centos7 创建一个jdk8的镜像
前言: 直接使用docker拉取jdk8镜像因有时区问题,设置后也不生效,所以干脆自己做一个 以下是Dockerfile文件 FROM centos:7 RUN ln -snf /usr/share/ ...
- $event - vue中默认参数的显示 - @on-change="func($event, code)" - 基础知识
@on-change="checkAllOnChangeHandle($event,scItem.code)"
- 基于恒玄WT250芯片的蓝牙辅听耳机方案调试总结
前记 在蓝牙辅听领域卷了几年之后.各种型号的蓝牙辅听器都做过.这次,客户需要一款性价比超高的蓝牙辅听器.经过成本以及功能考量的筛选.最终定下来使用wt250来做一款低成本的蓝牙辅听器. 硬件部分 wt ...
- iot梳理
近段时间一直在搞公司的iot项目,没啥时间学习新的知识(也是自己懒),这边记录下整体对iot知识领域的认识. 首先说到iot会想到物联网,对于我们开发来说物联网很明显要用到几个不太常用到的技术,如mq ...