磁力块

Description

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

小取酒带着一块自己的磁石L 来到了这篇原野的(x0,y0)处,我们可以视为磁石L 的坐 标为(x0,y0)。小取酒手持磁石L 并保持原地不动,所有可以被L 吸引的磁石将会被吸引过 来。在每个时刻,他可以选择更换任意一块自己已经获得的磁石(当然也可以是自己最初携 带的L 磁石)在(x0,y0)处吸引更多的磁石。小取酒想知道,他最多能获得多少块磁石呢?

Input Format

第一行五个整数x0,y0,pL,rL,N,表示小取酒所在的位置,磁石L 磁力、吸引半径和原野 上散落磁石的个数。

接下来N 行每行五个整数x,y,m,p,r,描述一块磁石的性质。

Output Format

输出一个整数,表示最多可以获得的散落磁石个数(不包含最初携带的磁石L)。

Sample Input

0 0 5 10 5
5 4 7 11 5
-7 1 4 7 8
0 2 13 5 6
2 -3 9 3 4
13 5 1 9 9

Sample Output

3

解析

显然我们可以建立一个\(bfs\)框架,队列中存储着每一次已经拿到的磁石,然后每次尝试用队头的磁石去吸引其他磁石,能够吸引到其他磁石就把磁石加入到队尾,直到队列为空。

那么我们需要解决的问题就是快速地判断哪些磁石能够被吸引,而判断是否能够被吸引的有两个关键信息:"质量"和"距离",我们考虑如下的分块算法:

将\(n\)块石头按照质量排序,分为\(\sqrt n\)段,每一段中再按距离排序。

那么对于每一次队首的磁石,一定存在一段满足:这段以前所有磁石质量都小于当前队首磁石的磁力,这段以后所有磁石质量都大于当前队首磁石的磁力。

对于前一部分,由于每一段内部已经按照距离重新排过序,那么可以被吸引的磁石就一定在这些段的左端,对每一段将吸引的磁石加入,并将该段的开头移动到没有被吸引的第一个位置即可。

对于这一段,直接暴力扫描,将能吸引的磁石处理掉即可。

对于前一种处理方式来说,均摊复杂度是\(O(1)\)的,总复杂度为\(O(\sqrt n)\),对于朴素扫描的的那一段来说,时间复杂度也是\(O(\sqrt n)\),所以总的时间复杂度就是\(O(n\sqrt n)\)。

\(Code:\)

#include <bits/stdc++.h>
using namespace std;
const int N = 250020 , SIZE = 5200;
struct magnet
{long long m,p,r,dis;
};
magnet a[N],st;
long long n,x_,y_,l[SIZE],r[SIZE],belo[N],T,size,ans,flag[N],Maxm[SIZE];
inline long long calc(long long x1,long long y1,long long x2,long long y2)
{return (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2);
}
inline void input(void)
{scanf("%lld%lld%lld%lld%lld",&x_,&y_,&st.p,&st.r,&n);st.m = 0 , st.dis = 0 , st.r *= st.r;for (int i=1;i<=n;i++){long long x,y,m,p,r;scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&p,&r);a[i] = (magnet){m,p,r*r,calc(x,y,x_,y_)};}
}
inline void setblocks(void)
{T = sqrt(n) , size = n/T;for (int i=1;i<=T;i++){if ( i * size > n ) break;l[i] = (i-1) * size + 1;r[i] = i * size;}if ( r[T] < n ) T++ , l[T] = r[T-1] + 1 , r[T] = n;for (int i=1;i<=T;i++)for (int j=l[i];j<=r[i];j++)belo[j] = i;
}
inline bool compare_m(magnet p1,magnet p2)
{return p1.m < p2.m;
}
inline bool compare_d(magnet p1,magnet p2)
{return p1.dis < p2.dis;
}
inline void init(void)
{sort( a+1 , a+n+1 , compare_m );for (int i=1;i<=T;i++)Maxm[i] = a[r[i]].m , sort( a+l[i] , a+r[i]+1 , compare_d );
}
inline void bfs(void)
{queue < magnet > q;q.push(st);while ( !q.empty() ){magnet t = q.front(); q.pop(); ans ++;for (int i=1;i<=T;i++){if ( Maxm[i] <= t.p ){for (int j=l[i];j<=r[i];j++){if ( a[j].dis <= t.r ) {if ( !flag[j] )flag[j] = true , q.push(a[j]);}else {l[i] = j; break;}if ( j == r[i] ) l[i] = r[i] + 1;}}else{for (int j=l[i];j<=r[i];j++)if ( !flag[j] && a[j].dis <= t.r && a[j].m <= t.p )flag[j] = true , q.push(a[j]); break;}}}
}
int main(void)
{input();setblocks();init();bfs();printf("%lld\n",ans-1);return 0;
}

转载于:https://www.cnblogs.com/Parsnip/p/10902133.html

『磁力块 bfs 分块』相关推荐

  1. AW250 磁力块(分块)

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

  2. 『TopCoder 组件开发指南』

    导读: 『TopCoder 组件开发指南』 Ⅰ. 简介 TopCoder 组件开发 TopCoder 组件开发使用的语言包括Java 和C#,尽管这两种语言有较大差别,但开发过 程却非常相似.本指南将 ...

  3. 『深度学习项目四』基于ResNet101人脸特征点检测

    相关文章: [深度学习项目一]全连接神经网络实现mnist数字识别 [深度学习项目二]卷积神经网络LeNet实现minst数字识别 [深度学习项目三]ResNet50多分类任务[十二生肖分类] 『深度 ...

  4. Day03『NLP打卡营』实践课3:使用预训练模型实现快递单信息抽取

    Day03 词法分析作业辅导 本教程旨在辅导同学如何完成 AI Studio课程--『NLP打卡营』实践课3:使用预训练模型实现快递单信息抽取 课后作业. 1. 更换预训练模型 在PaddleNLP ...

  5. day01『NLP打卡营』实践课1:词向量应用演示

    Day01 词向量作业辅导 本教程旨在辅导同学如何完成 AI Studio课程--『NLP打卡营』实践课1:词向量应用展示 课后作业. 1. 选择词向量预训练模型 在PaddleNLP 中文Embed ...

  6. 『遥かに仰ぎ、丽しの』游戏初回版特典原声集 GAME SP OST(下载、中日双语歌词)...

    记得苍月的结局音乐和内容一样很棒. 大师就给大家送上遥かに仰ぎ.丽しの GAME SP OST 本期策划:大师♂罗莊 翻译:天界白魔导 为什么网上已经有翻译,大师还要组织翻译歌词呢呢? 同学,这个翻译 ...

  7. 射手科技公开课第一辑 『项目管理和代码规范』

    射手玩的东西越来越全面了,从当年的字幕下载站,到播放器,到射手科技,发展的思路值得借鉴和思考. 射手科技成立3个月以来,我们内部已经组织了不少培训.每次内部培训我们都留有录像和录音,以便后续参与项目的 ...

  8. MuPlayer『百度音乐播放内核』

    MuPlayer『百度音乐播放内核』 -- 跨平台.轻量级的音频播放解决方案. 多端(PC & WebApp)通用,统一的API调用方式 HTML5 Audio与Flash内核的平滑切换(支持 ...

  9. 『Photo Shop实用技巧』之 去除红眼

    『Photo Shop实用技巧』之 去除红眼 往往夜间拍摄或者使用闪光灯的时候会造成"红眼"的现象,现在给大家一个简单的办法去除红眼 此主题相关图片如下: 非常抱歉,我没有&quo ...

最新文章

  1. 计算机组成原理 — 异构计算
  2. 从头搭建 IntelliJ IDEA 环境,从放弃到爱不释手!
  3. MySQL注入中load_file()函数的应用
  4. javascript一些常用的代码
  5. Autofac实现有条件的DI
  6. JS实现逼真的雪花飘落特效
  7. ES11新特性_Promise.allSettled---JavaScript_ECMAScript_ES6-ES11新特性工作笔记062
  8. 中文代码示例之Vuejs入门教程(一)
  9. 2016-08-31
  10. 格式notepad自动对齐_6.2 对齐设置
  11. python cnn模型_CNN系列模型发展简述(附github代码——已全部跑通)
  12. QuickFlowDesigner教程(4)如何用代码控制活动操作人
  13. settings sync 怎么用_用好这7个VS Code插件,前端编程效率蹭蹭涨
  14. WCF 项目应用连载[8] - 绑定、服务、行为 大数据传输与限流 - 下 (ServiceThrottlingAttribute)...
  15. 和利时DCS系统设服务器,和利时DCS系统全套资料.pdf
  16. 什么是敏捷管理及scrum方法
  17. 古筝d调变降e调怎么办_为什么古筝总要调音、还总调不好?
  18. Sql Server 2008 配置服务器,并让客户端连接
  19. poi操作word常用操作方法,word工具包
  20. Win32汇编:PE结构解析器

热门文章

  1. CSS综合示例(博雅首页)
  2. 字、字节、位、字长?区别?关系?
  3. Office 365 共享邮箱/日历
  4. 智慧城市建设解决方案,智慧公安系统
  5. QT实现一维码识别之Code128
  6. TensorFLow 数学运算
  7. 使Ubuntu更好用的一些软件/配置
  8. pca = PCA(n_components=117, whiten=True, random_state=42)中random_state参数作用
  9. [答疑]EA中画状态转换图如何画的,就是画的那种曲线
  10. nyoj 708 ones