正解:分块+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. 这些APP开发技巧可少花60万!

    用户需求——我偏不用干嘛要装? 随着手机的普及,大众流量的端口从电脑转移到手机,传统的商业平台从线下到电脑再到手机进行了转换.手机APP作为移动互联网的入口,众多创业者凭借一个手机APP成就了亿万财富 ...

  2. 很烦人的maven和gradle的jar缓存

    1. 起因 a. 最近在学习大数据相关东西,自然就少不免去操作linux系统,更别说不敲命令 b. 然而那个配置软件时,很经常使用ln -s为一个软件目录(带着版本或者其他信息的长命名)创建别名(软连 ...

  3. 转:图像处理、显示中的行宽(linesize)、步长(stride)、间距(pitch)

    在图像数据传输和显示的过程中有一个不常用的参数:间距. 间距的名称: 它有很多的别名,在使用d3d显示的时候,它叫pitch:在用ffmpeg解码的时候,它叫linesize: 在用ffmpeg转换格 ...

  4. [Linux 性能调优] 网卡中断与CPU的绑定问题

    在Linux的网络调优方面,如果你发现网络流量上不去,那么有一个方面需要去查一下:网卡处理网络请求的中断是否被绑定到单个CPU(或者说跟处理其它中断的是同一个CPU). 先说一下背景 网卡与操作系统的 ...

  5. [转]Kindeditor图片粘贴上传(chrome)

    原文地址:https://www.cnblogs.com/jsper/p/7608004.html 首先要赞一下kindeditor,一个十分强大的国产开源web-editor组件. kindedit ...

  6. 【iCore4 双核心板_uC/OS-II】例程八:消息邮箱

    一.实验说明: 消息邮箱是uC/OS-II中的另一种通信机制,可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量.通常该指针指向一个包含了“消息”的特定数据结构.   二.实验截图:   ...

  7. C语言 · 8皇后问题改编

    8皇后问题(改编) 问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8的棋盘. 输出格式 所能得到的最大数字和 样例输入 1 2 3 4 5 ...

  8. Scala学习笔记(七):Rational、隐式转换、偏函数、闭包、重复参数及柯里化

    class Rational(n: Int, d: Int) { require(d != 0) private val g: Int = gcd(n, d) val number: Int = n ...

  9. Android 最流行的吸顶效果的实现及代码

    开始逐渐领略到ItemDecoration的美~ 今天让我 使用 ItemDecoration 来完成 可推动的悬浮导航栏的效果,最终实现的效果如下图: 具体实现步骤如下: 根据我前面的文章所讲的Re ...

  10. etl数据同步工具 kettle

    kellet使用 https://www.cnblogs.com/gala1021/p/7814712.html