正解:分块+bfs

解题报告:

先放个传送门,然后瞎扯淡下QAQ

突然感觉不停课大概是正确的选择QAQ

大概实在是没有天赋?明明都知道正解是分块甚至还听了下解法感觉理解了,再看一次依然没想到解法,,,好菜啊,,,所以这种明明都落实过然而再看一次还是做不出来的题目是最最应该写题解的了QAQ

昂不叨叨了说说这题正解

1)  显然的是每块石头能吸的磁石是固定的,不存在改变次序之后会有改变,所以直接拿得到哪个磁石就把这个磁石能吸到的磁石都加入   队列,bfs就好了

这里是个最简单的暴力想法?还是不难想的我觉得qwq

还一个很显然的是这个暴力会超时,于是怎么优化呢?

当当!分块!好了说完了没了

2) ummm我第二次看到这题的时候就卡在这儿了QAQ不知道怎么分块QAQ

这时候重新梳理下这题,冷静思考一下这题,发现如果磁石被吸引要有俩条件

第一个是质量<=磁力;第二个是距离<=半径

根据分块的常见思路来说显然就是根据一个分块根据另一个在分块内部再排序是趴

那就以按质量分块为例说下大致思路(阿西其实是书中讲的按质量分块我也不清楚能不能按距离?大胆猜测一波也许可以趴QAQ打算有时间去打下按距离分块的看看可不可以qwq

那按照常见套路来说就是按质量分块然后再在内部按照距离分块

这样的话对每个磁石都是只有前面一些块能吸上(满足质量qwq

然后每个块的内部又是只有前面一些块能吸上(满足距离qwq

然后就朴素扫描一波就欧克了

嗷这么简单的优化当然是不够的

还有一个小tips是说,每个块内部能被吸走的磁石一定是连续的(显然qwq

所以可以记录下每块内部最后一个被吸走的磁石的位置,这样每个块内部每次算的时候直接从第一个没被吸走的磁石开始枚举就好了

太难受辽,对了几个数据错了几个

唯一安慰的就是CH可以随便下数据QAQ太美好辽QAQ

然后先存下代码,晚上打完QAQ

之前思考完之后就打代码嘛,然后出现了好几个错误,这里记录一下QAQ

第一个是符号打错辽?就<打成>了然后居然过了样例,,,太水了点儿这个也,,,

第二个是距离要用double,其实我开始想了一下?然后不知道哪来的自信觉得,不要开double耶,,,然后调了贼久,,,烦躁,大概才是原罪趴:D

第三个是没开ll,依然是距离那儿,改了半天发现出现了-nan?于是就猜出来估计是要ll

第四个是全开ll会超时,然后其实只要距离那儿开ll就行了

over:D

然后放个代码就,完美结束辽?

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rp(i,x,y) for(register int i=x;i<=y;++i)
#define my(i,x,y) for(register int i=y;i>=x;--i) const int N=+,sqtN=+;
int x,y,pl,rl,n,len,mx[sqtN],fr[sqtN],bl[N],to[sqtN],ans;
bool vis[N];
queue<int>Q; inline int read()
{
register char ch=getchar();register int x=;register bool y=;
while(ch!='-' && (ch<'' || ch>''))ch=getchar();
if(ch=='-')ch=getchar(),y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=getchar();
return y?x:-x;
} struct node
{
int m,p,r,bl;double jl;
inline void rd(){int xx=read(),yy=read();jl=(double)sqrt((ll)(x-xx)*(x-xx)+(ll)(y-yy)*(y-yy));m=read();p=read();r=read();}
}st[N]; inline bool cmp1(node gold,node genius){return gold.m<genius.m;}
inline bool cmp2(node gold,node genius){return gold.bl==genius.bl?gold.jl<genius.jl:gold.bl<genius.bl;}
inline void pre()
{
x=read();y=read();st[].p=pl=read();st[].r=rl=read();n=read();len=sqrt(n);
rp(i,,n)st[i].rd();sort(st+,st++n,cmp1);
rp(i,,n)st[i].bl=(i-)/len+;
rp(i,,(n-)/len+)fr[i]=(i-)*len+,to[i]=min(n,i*len),mx[i]=st[to[i]].m;
sort(st+,st++n,cmp2);
}
inline void work()
{
Q.push();
while(!Q.empty())
{
int now=Q.front();Q.pop();
rp(i,,(n-)/len+)
{
if(mx[i]>st[now].p)
{
rp(j,fr[i],to[i])if(st[j].jl<st[now].r && st[j].m<=st[now].p && !vis[j])vis[j]=,Q.push(j),++ans;
break;
}
rp(j,fr[i],to[i]){if(st[j].jl>st[now].r)break;if(!vis[j])vis[j]=,Q.push(j),++ans;++fr[i];}
}
}
printf("%d\n",ans);
} int main(){pre();work();}

这儿!是!代码!qwq!

啊不对之前提出了俩问题依然没有得到解决,但是我现在这么菜的实力大概还是搞不出来的,等以后做的题目比较多了再来总结,也许会总结到分块学习笔记中?

重申一下问题是啥哦qwq

就,为什么这题看到之后会想到用分块以及这个题目的时间复杂度(好像说分摊下来是O(n)?然而不会证明:D真好:D

好滴强行当做搞完了溜了qwq

CH#46 磁力块 分块的更多相关文章

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

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

  2. CH#46A 磁力块

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

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

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

  4. 『磁力块 bfs 分块』

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

  5. 【CHOJ】磁力块

    题意描述 磁力块 在平面内分布着 \(N\) 个磁力块,同时你的手上也有一块. 你一开始站在给定的坐标上,当磁力块之间满足互相吸引的条件时就可以吸引. 当你拿到新的磁石时你就可以用它来吸引更多的石头, ...

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

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

  7. CH Round #46A 磁力块

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

  8. HDU 4391 - Paint The Wall - 分块哈希入门

    题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=4391 题意 : 给一段区间, 有两种操作 1 : 给 x 到 y 的区间染色为 z 2 : 查询 ...

  9. Java读取Level-1行情dbf文件极致优化(3)

    最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1 ...

随机推荐

  1. 简单理解 RPC(转载)

    原文地址:http://www.syyong.com/architecture/Simple-understanding-of-RPC.html RPC(Remote Procedure Call P ...

  2. Tomcat热部署的三种方式

    原文地址:https://blog.csdn.net/nlwangxin/article/details/49734659热部署是指在你修改项目BUG的时候对JSP或JAVA类进行了修改在不重启WEB ...

  3. Mathmatica简介

    作者:桂. 时间:2018-06-27  21:53:34 链接:https://www.cnblogs.com/xingshansi/p/9236502.html 前言 打算系统学习一些数学知识,容 ...

  4. 【原创 Hadoop&Spark 动手实践 8】Spark 应用经验、调优与动手实践

    [原创 Hadoop&Spark 动手实践 7]Spark 应用经验.调优与动手实践 目标: 1. 了解Spark 应用经验与调优的理论与方法,如果遇到Spark调优的事情,有理论思考框架. ...

  5. PhpStorm连接Docker容器配置xdebug断点调试

    本教程主要演示xdebug在PhpStorm中配置方法. 一.环境说明 1.Mac笔记本(本教程演示过程使用的是Mac OS操作系统,和windows环境是有区别的,这一点需要特别注意): 2.在Ma ...

  6. js正则匹配html标签中的style样式和img标签

    <!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...

  7. Git入门到高级系列1-git安装与基础命令

    视频课程地址 腾讯课堂 为什么要进行项目文件的版本管理 代码备份和恢复 团队开发和协作流程 项目分支管理和备份 git 是什么? git是一个分布式的版本控制软件.版本控制是一种记录一个或若干文件内容 ...

  8. 原创:在局域网中,如何知道某个IP被占用 show arp

    如果某一栋楼有三层交换机(一般为汇聚层交换机),只需要在该三层交换机输入命令:show arp,即可知道当前那些IP地址被占用.如果该栋楼只有二层交换机(接入层交换机),需要在连接该二层交换机的上级三 ...

  9. 大话Json对象和Json字符串

    一.Json对象和Json字符串的区别 (1)Json对象:可以通过javascript存取属性. 先介绍一下json对象,首先说到对象的概念,对象的属性是可以用:对象.属性进行调用的.例如: var ...

  10. 如何在云端部署SAP HANA实战, Azure 上的 SAP HANA(大型实例)概述和体系结构

    什么是 Azure 上的 SAP HANA(大型实例)? Azure 上的 SAP HANA(大型实例)是一种针对 Azure 的独特解决方案. 除了提供 Azure 虚拟机以用于部署和运行 SAP ...