链接

https://ac.nowcoder.com/acm/problem/51114

题意

有 NNN 块磁石,每个磁石的性质可以用一个五元组 (x,y,m,p,r)(x,y,m,p,r)(x,y,m,p,r) 描述,其中 x,yx,yx,y 表示其坐标,mmm是磁石的质量,ppp 是磁力,rrr 是吸引半径

若磁石 A 与磁石 B 的距离不大于磁石A的吸引半径,并且磁石 B 的质量不大于磁石 A 的磁力,那么 A 可以吸引 B

现在有一块磁石 L,坐标为 (x0,y0)(x0,y0)(x0,y0),保持原地不动,所有可以被 L 吸引的磁石将会被吸引过来。
在每个时刻,可以选择更换任意一块自己已经获得的磁石(当然也可以是自己最初携带的L磁石)在 (x0,y0)(x0,y0)(x0,y0) 处吸引更多的磁石

最多能获得多少块磁石?

思路

分块

利用 BFS,建立队列,先将磁石 L 放入队列

将 nnn 块磁石按照质量从小到大排序并分成 n\sqrt{n}n​ 段,再将每一段中磁石按离 (x0,y0)(x0,y0)(x0,y0) 的距离从小到大排序

每次队头磁石吸引磁石时,必能找到第 kkk 段使:

1∼k−11 \sim k-11∼k−1 段中的每一块磁石的质量都小于等于队头的磁力

k+1k+1k+1 段后的磁石的质量都大于队头的磁力

因此对于 1∼k−11 \sim k-11∼k−1 段的磁石,如果该块磁石未被吸引并且距离小于等于队头的磁力,入队,当扫描到第一个距离大于队头的磁力时,将该段的段首改为该点,这样已经被吸引的磁石就不会被扫描到

对于第 kkk 段的磁石,朴素扫描即可

时间复杂度为 O(nn)O(n\sqrt{n})O(nn​)

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+5;
int n,t;
ll x_0,y_0;
int cnt;
int L[500],R[500],M[500];
bool st[N];
int ans;
struct node {int m,p;ll d,r;
}s[N];
bool cmp1(node a,node b) {return a.m<b.m;
}
bool cmp2(node a,node b) {return a.d<b.d;
}
void pre() {cin>>x_0>>y_0>>s[0].p>>s[0].r>>n;s[0].r*=s[0].r;for(int i=1;i<=n;i++) {ll x,y,r;int m,p;cin>>x>>y>>m>>p>>r;s[++cnt]={m,p,(x-x_0)*(x-x_0)+(y-y_0)*(y-y_0),r*r};} sort(s+1,s+1+n,cmp1);t=sqrt(n);for(int i=1;i<=t;i++) {L[i]=R[i-1]+1;R[i]=i*t;}if(R[t]<n) t++,L[t]=R[t-1]+1,R[t]=n;for(int i=1;i<=t;i++) {M[i]=s[R[i]].m;sort(s+L[i],s+1+R[i],cmp2);}
}
void bfs() {queue<int>q;q.push(0);while(!q.empty()) {int now=q.front();q.pop();for(int i=1;i<=t;i++) {if(M[i]>s[now].p) {for(int j=L[i];j<=R[i];j++) {if(!st[j]&&s[j].m<=s[now].p&&s[j].d<=s[now].r) {st[j]=true;ans++;q.push(j);}else if(s[j].d>s[now].r) break;}break;}while(L[i]<=R[i]&&s[L[i]].d<=s[now].r) {if(!st[L[i]]) {st[L[i]]=true;ans++;q.push(L[i]);}L[i]++;}}}
}
int main() {ios::sync_with_stdio(false);cin.tie(0);pre();bfs();cout<<ans<<endl;return 0;
}

NC 51114. 磁力块相关推荐

  1. 『磁力块 bfs 分块』

    磁力块 Description 在一片广袤无垠的原野上,散落着N 块磁石.每个磁石的性质可以用一个五元组 (x,y,m,p,r)描述,其中x,y 表示其坐标,m 是磁石的质量,p 是磁力,r 是吸引半 ...

  2. #广搜,分块#jzoj 3974 CH #46A 磁力块

    题目 主人公一开始在一个位置用磁铁吸引其它磁铁,当磁铁的质量≤\leq≤磁力就会吸到主人公手里,不在主人公手里的磁铁不会互相吸引,主人公可以更换磁铁,但是只能原地不动,问主人公最多能吸到多少块磁铁 分 ...

  3. Contest Hunter #46 T1 磁力块 [分块]

    描述 在一片广袤无垠的原野上,散落着N块磁石.每个磁石的性质可以用一个五元组(x,y,m,p,r)描述,其中x,y表示其坐标,m是磁石的质量,p是磁力,r是吸引半径.若磁石A与磁石B的距离不大于磁石A ...

  4. 【题解】CH#46A 磁力块 分块+排序+队列

    题目链接 题目描述 在一片广袤无垠的原野上,散落着N块磁石.每个磁石的性质可以用一个五元组(x,y,m,p,r)描述,其中x,y表示其坐标,m是磁石的质量,p是磁力,r是吸引半径.若磁石A与磁石B的距 ...

  5. 蓝书(算法竞赛进阶指南)刷题记录——CH#46A BZOJ3276 磁力块(bfs+分块)

    题目:CH#46A. 题目大意:有一个元素a0=(x0,y0,m0,p0,r0)a_0=(x_0,y_0,m_0,p_0,r_0)a0​=(x0​,y0​,m0​,p0​,r0​)和其它nnn个元素a ...

  6. AW250 磁力块(分块)

    题目地址 易错点: 和要用long long存储. 读入的吸引半径需要乘方(因为通过(x-x0)*(x-x0)-(y-y0)*(y-y0)获取的值本身就是乘方的). (分块)右端点需要用min(n,i ...

  7. find 命令的参数详解

    使用name选项 文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用. 可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来.不管当前路径是什么,如果想要在自 ...

  8. FMS3系列(六):使用远程共享对象(SharedObject)实现多人时时在线聊天(Flex | Flash)

    FMS开发中,经常会使用共享对象来同步用户和存储数据.对于实现广播文字信息实现聊天的支持非常强大,还可以跟踪用户的时时动作,在开发Flash多人在线游戏中的应用也非常广阔. 在使用FMS开发共享对象时 ...

  9. ios俩个APP之间跳转、传值

    两个APP之间的跳转是通过[[UIApplication sharedApplication] openURL:url]这种方式来实现的. 1.首先设置第一个APP的url地址 2.接着设置第二个AP ...

最新文章

  1. 怎么给mysql用户添加权限_MySQL下添加用户以及给予权限的实现
  2. nginx $mail-send()发送邮件报错_基于SMTP协议的E-MAIL电子邮件发送客户端软件C#实现...
  3. sparkstreaming 读取mysql_SparkStreaming读取Kafka的两种方式
  4. idea项目在maven projects中变灰色带有删除线的解决办法
  5. codeforce C. Okabe and Boxes
  6. Oracle_视图_索引_plsql_游标_存储过程_存储函数_触发器
  7. Python 密集知识点汇总
  8. c51汇编语言循环指令,汇编语言循环指令loop
  9. Windows 10上不使用MicroSoft Store下载安装MicroSoft Todo
  10. 《谁动了我的奶酪》感悟
  11. python header函数_Header函数
  12. 复杂sql语句:按部门统计人数
  13. Redis 作者 Antirez 讲如何实现分布式锁?Redis 实现分布式锁天然的缺陷分析Redis分布式锁的正确使用姿势!...
  14. ev4a ev6 ev8文件转换为mp4翻录教程
  15. base64 decode java_Java实现Base64编解码
  16. linux的的shell记忆
  17. 数学历史上的三次危机
  18. 读书笔记 | 为什么从世界500强CEO、政界要员,到著名演员都用这个方法来提高效率?
  19. 美国硅基和宽禁带半导体供应链竞争力剖析
  20. UnityShader-菲涅尔反射(Fresnel Reflection)

热门文章

  1. 【模型推理加速系列】06: 基于resnet18加速方案评测
  2. java求外接圆圆心_由三点三维坐标计算圆半径和圆心位置
  3. JavaScript - 内置对象
  4. 蜗牛学院深度分析:为什么计算机专业的应届生找工作越来越难?
  5. iOS--UI之导航控制器与标签控制器
  6. calc( )计算css属性值
  7. 中南大学:误解已解除!
  8. 来自一枚rookie的项目开发——Nginx Centos 8 or 7 下载安装
  9. laravel中ajax使用
  10. 数据结构java版本