题意描述

磁力块

在平面内分布着 \(N\) 个磁力块,同时你的手上也有一块。

你一开始站在给定的坐标上,当磁力块之间满足互相吸引的条件时就可以吸引。

当你拿到新的磁石时你就可以用它来吸引更多的石头,求你能吸引到的最多的磁石个数。

算法分析

既然一开始就确定了磁石,我们只需要依次 BFS 手上已有的磁石并吸引更多的磁石入队即可。

关键在于判定磁石能否被吸引,如果直接循环判断复杂度是 \(O(N^2)\) 的,所以需要数据结构来优化。

维护一个多维的结构貌似可以用平衡树,但是更好的方法是用代码复杂度小很多的分块来解决。

具体做法是将 \(N\) 个数按照质量大小排序之后分为 \(T\) 块,在每块内部在按照距离的远近排序。

同时维护每个块内最大质量为 \(H_i\)。

那么每次拿到一块磁石时就顺次遍历 \(T\) 个区间,每次如果磁力 \(\geq H_i\) 就直接遍历第 \(i\) 块来判断。

否则遍历整个区间并退出循环。(后面的质量一定大于磁力,不用做冗余判断)

遍历每个区间的均摊时间复杂度为 \(O(1)\),遍历 \(T\) 次为 \(O(T)\),加上 BFS 就为 \(O(NT)\)。

显然 \(T\) 取 \(\sqrt N\) 时最优,总时间复杂度为 \(O(N\sqrt N)\)。

代码实现

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<queue>
#define N 2000010
#define len 500
using namespace std;
typedef long long ll; ll n,tot,L[N],R[N],H[N];
bool vis[N];
struct node{
ll d,r,m,p;
}a[N];
queue<ll>q; ll read(){
ll x=0,f=1;char c=getchar();
while(c<'0' || c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0' && c<='9') x=x*10+c-48,c=getchar();
return x*f;
} bool cmp1(node a,node b){
return a.m<b.m;
} bool cmp2(node a,node b){
return a.d<b.d;
} int main(){
ll x0,y0,x,y;
x0=read();y0=read();a[0].p=read();a[0].r=read();
n=read();
a[0].r*=a[0].r;
for(ll i=1;i<=n;i++){
x=read();y=read();
a[i].m=read();a[i].p=read();a[i].r=read();
a[i].r*=a[i].r;
a[i].d=(x0-x)*(x0-x)+(y0-y)*(y0-y);
}
sort(a+1,a+n+1,cmp1);
for(ll i=1;i<=n;i+=len){
L[++tot]=i;R[tot]=min(n,i+len-1);
H[tot]=a[R[tot]].m;
sort(a+L[tot],a+R[tot]+1,cmp2);
}
q.push(0);
int ans=0;
while(!q.empty()){
ll now=q.front();
ll r=a[now].r,p=a[now].p;
q.pop();
for(ll i=1;i<=tot;i++){
if(H[i]>p){
for(ll j=L[i];j<=R[i];j++)
if(!vis[j] && a[j].d<=r && a[j].m<=p){
q.push(j);vis[j]=true;ans++;
}
break;
}
while(L[i]<=R[i] && a[L[i]].d<=r){
if(!vis[L[i]]){q.push(L[i]);ans++;}
++L[i];
}
}
}
printf("%lld\n",ans);
return 0;
}

完结撒❀。

【CHOJ】磁力块的更多相关文章

  1. CH#46A 磁力块

    题意 磁力块 CH Round #46 - 「Adera 8」杯NOI模拟赛 描述 在一片广袤无垠的原野上,散落着N块磁石.每个磁石的性质可以用一个五元组(x,y,m,p,r)描述,其中x,y表示其坐 ...

  2. 『磁力块 bfs 分块』

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

  3. CH#46 磁力块 分块

    正解:分块+bfs 解题报告: 先放个传送门,然后瞎扯淡下QAQ 突然感觉不停课大概是正确的选择QAQ 大概实在是没有天赋?明明都知道正解是分块甚至还听了下解法感觉理解了,再看一次依然没想到解法,,, ...

  4. CH #46A - 磁力块 - [分块]

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

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

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

  6. Contest Hunter #46 T1 磁力块 [花式暴力]

    将所有石头按距离远近排序,将所有取到的时候扔进堆里维护最大磁力强度. 贪心,每次用强度最强的磁石尝试吸引地上的石头,扫完区间以后,这块石头就再也不会用到了. 在此基础上可以做些小优化,比如说优化未取石 ...

  7. CH Round #46A 磁力块

    还是一道好题的 对于一个磁石是否被吸引,有两个关键字:距离和质量.(二维偏序??) 好像是很厉害的分块姿势,先按第一关键字排序,在块中按第二关键字排 进行bfs,对于当前磁石,有1~k-1个块是第一关 ...

  8. [搜片神器]使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)

    谢谢园子朋友的支持,已经找到个VPS进行测试,国外的服务器:http://www.sosobta.com   大家可以给提点意见... 出售商业网站代码,万元起,非诚勿扰,谢谢. 联系h31h31 a ...

  9. 使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)

    使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源) 先直接上程序界面,了解整体工作流程是什么样子的,求服务器进行挂机测试,需要固定IP,空间大概需要10G左右(主要是BT种子占用空间 ...

随机推荐

  1. vue安装教程

    Vue.js 安装教程 安装node.js https://nodejs.org/zh-cn/download/ 选择一个适合自己电脑的版本下载 下载成功, 直接安装, 全部点击下一步 然后输入 黑窗 ...

  2. Office远程代码执行漏洞(CVE-2017-11882)

    POC: https://github.com/Ridter/CVE-2017-11882/ 一.简单的生成弹计算器的doc文件. 网上看到的改进过的POC,我们直接拿来用,命令如下: #python ...

  3. 【题解】CF940F Machine Learning

    Link 题目大意:单点修改,每次询问一个区间的所有颜色出现次数的\(\text{Mex}.\) 例如,区间中三种颜色分别出现了\(2,2,3\)次,又因为其他颜色出现次数一定是\(0\),所以这里的 ...

  4. LNMP架构介绍与部署

    一.LNMP架构介绍 LNMP:Linux系统下Nginx+MySQL+PHP这种网站服务器架构.Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器.My ...

  5. .NET Standard 版本支持

    系列目录     [已更新最新开发文章,点击查看详细] .NET标准已版本化.每个新版本都添加了更多的api.当库是针对某个.NET标准版本构建的时,它可以在实现该版本的.NET标准(或更高版本)的任 ...

  6. 获取url中带的参数

    本文目前只针对url中一个参数的 function getQueryString(name) { var reg = new RegExp("(^|&)" + name + ...

  7. 关于 ECMAScript、JavaScript、ES6、ECMAScript 2015

    ECMAScript 是一种规范,而 JavaScript 是对规范的实现.ECMA 是标准化组织. 最早的 JavaScript 是由 Netscape 公司开发的,并提交给 ECMA 标准化组织, ...

  8. 推荐一款IDEA神器!一键查看Java字节码以及其他类信息

    由于后面要分享的一篇文章中用到了这篇文章要推荐的一个插件,所以这里分享一下.非常实用!你会爱上它的! 开始推荐 IDEA 字节码查看神器之前,先来回顾一下 Java 字节码是啥. 何为 Java 字节 ...

  9. oracle 11g linux 导入中文字符乱码问题解决

    1. 涉及的字符集 这个可以分成三块,数据库服务器字符集(server).实例字符集(instance), 会话字符集(session) 2. 乱码的原因 session 的字符集和 server 的 ...

  10. docker registry 记录

    部署 运行下面命令获取registry镜像 docker pull registry 下载到的版本默认为 docker.io/registry latest 将registry镜像运行并生成一个容器 ...