题意描述

磁力块

在平面内分布着 \(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. AES加密 Pkcs7 (BCB模式) java后端版本与JS版本对接

    1.BCB模式是需要设置iv偏移量和Key值,这两个值就像账号和密码一样,当这两个值一致时才能确保加密和解密的数据一致.(ps:这两个值千万不能暴露出去哦!) 2.JAVA版本代码: 这里的iv偏移量 ...

  2. lens distortion

    来源:http://michel.thoby.free.fr/Fisheye_history_short/International_Standards_about_Distortion.html H ...

  3. 从字节码层次看i++和++i

    关于的Java的i++和++i的区别,初学者可能会混淆,这时候有经验的同学或同事就会告诉你,++在后,就会立马加值, ++在后则会等会儿再加,所以如果i == 0 ,那么i++ == 0,++i == ...

  4. 如何在yii2直接执行SQL

    执行SQL $connection=Yii::app()->db;   // 假设你已经建立了一个 "db" 连接 $sql = "SELECT * FROM tb ...

  5. C&C++代码单元集成测试培训

    课程简介 本课程为期3天,结合实例讲解如何使用Cantata开展C和C++代码,通过培训,可以明显提高工程师操作Cantata的效率,并加速单元测试和集成测试. [日期]2020年11月3日-5日(共 ...

  6. scrapy LinkExtractors

    class scrapy.linkextractors.LinkExtractor Link Extractors 的目的很简单: 提取链接。 每个LinkExtractor有唯一的公共方法是 ext ...

  7. linux安装jdk-centos7系统:

      1 官网下载        http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

  8. 第二十一章 PHP编译安装(centos7)

    一.环境准备 主机 IP 身份 web01 10.0.0.7 编译安装PHP 二.准备安装 1.新建目录 [root@jindada ~]# mkdir /php 2.上传源码包并解压 [root@j ...

  9. 第十三章 nginx代理服务

    一.数据库迁移 1.常见原因 1.数据库要做升级2.数据库服务器到期需要迁移 2.新服务器搭建数据库 [root@db02 ~]# yum install -y mariadb-server 3.启动 ...

  10. UI设计学习总结

    UI设计学习总结 平面设计基础 平面构成 三大构成:点线面 重复构成 相同,有规律的重复 近似构成 形状,大小,色彩,肌理相似 渐变构成 色彩逐渐变化 发射构成 通过一点向四周扩散犹如绽放的花朵 密集 ...