题意描述

磁力块

在平面内分布着 \(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. Python-输入输出-input ouput

    输入.输出? 这种统称为IO流,也就是数据流向,在标准中,从终端输入称为标准输入 sidin,从终端输出为标准输出 stdout,从终端错误输出则为标准错误输出 stderr.这些只是IO流中终端方面 ...

  2. Django 联合唯一UniqueConstraint

    from django.db import models class UserAttention(models.Model): watcher = models.ForeignKey('user.Us ...

  3. c++中CreateEvent函数

    参考:https://blog.csdn.net/u011642774/article/details/52789969 函数原型: HANDLE CreateEvent( LPSECURITY_AT ...

  4. MATLAB textread函数

    实际应用中经常要读取txt文件,这个时候就需要用到强大的textread函数.它的基本语法是:[A,B,C,...] = textread(filename,format)[A,B,C,...] = ...

  5. 【题解】CF413C Jeopardy!

    \(\color{blue}{Link}\) \(\text{Solution:}\) 首先,显然的策略是把一定不能翻倍的先加进来.继续考虑下一步操作. 考虑\(x,y\)两个可以翻倍的物品,且\(a ...

  6. 浅谈BSGS

    用于求解形如\(a^x≡b\mod p\)的最小非负整数解\(x\). 由欧拉定理\(a^{\phi(p)}≡1\mod p\)可以知道,我们找的解如果有解则一定在\(\phi(p)\)范围内,而最大 ...

  7. Mybatis老手复习文档

    Mybatis学习笔记 再次学习Mybatis,日后,有时间会把这个文档更新,改的越来越好,然后,改成新手老手通用的文档 1.我的认识 Mybatis 是一个持久层框架,(之前 我虽然学了这个myba ...

  8. bootStrap小结1

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. python 不可变类型

    不可变类型有:字符串,元祖,数字 可变类型:列表,字典 字典中,可变类型不能为key值 #在函数中 可变类型,为全局变量时,会变化 不可变类型,为全局变量时,不会变化

  10. elasticsearch要点及常用查询

    目录 elasticsearch要点及常用查询 查询与过滤 明确查询和过滤各自的优缺点,以及适用场景. 性能上的差异 适用场景 1.kibana 中操作es-查询 Mapping映射基础 mappin ...