正解:分块+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. 【C++】C++中变量的声明与定义的区别

    声明(declaration):意味着告诉编译器关于变量名称.变量类型.变量大小.函数名称.结构名称.大小等等信息,并且在声明阶段不会给变量分配任何的内存. 定义(definition):定义就是在变 ...

  2. 解决CEF中显示Flash动画弹出安全警告问题

    一. 1.Xilium.CefGlue. CefApp (CefApp.cs文件)类on_before_command_line_processing方法内设置flash路径.版本号等. m_comm ...

  3. JPA学习笔记(3)——JPA注解

    Entity Table Id GeneratedValue Basic Column Transient Temporal @Entity @Entity 标注用于实体类声明语句之前.指出该Java ...

  4. 【转载】浅谈事件冒泡与事件捕获 - javascript 事件代理

    原文:https://segmentfault.com/a/1190000000749838 事件冒泡与事件捕获 事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念都是为了解决页面中事件流(事件发 ...

  5. LeetCode 232:Implement Queue using Stacks

     Implement the following operations of a queue using stacks. push(x) -- Push element x to the back ...

  6. C# 操作PDF

    Spire.PDF组件概述 Spire.PDF是一个专业的PDF组件,用于在.NET应用程序中创建,编辑,处理和阅读PDF文档.支持丰富的PDF文档处理操作,如PDF文档合并/拆分.转换(如HTML转 ...

  7. 20款最好的JavaScript开发框架

    JavaScript语言有多种方式,创建交互式网站,Web应用程序.基本的JavaScript框架是预先写好的JavaScript代码集.这些JavaScript框架也被称为JavaScript库,开 ...

  8. js判断移动端是否安装某软软件,安装直接打开相应的链接,否则跳转到下载商店方法

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  9. input 呼起数字键盘

    1. Android,定义 type="number" 2. iOS,定义 style="ime-mode: disabled;" 注,呼起数字键盘后,用户输入 ...

  10. 【FM】算法

    https://www.cnblogs.com/AndyJee/p/7879765.html