CH#46 磁力块 分块
正解:分块+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 磁力块 分块的更多相关文章
- CH #46A - 磁力块 - [分块]
题目链接:传送门 描述在一片广袤无垠的原野上,散落着N块磁石.每个磁石的性质可以用一个五元组(x,y,m,p,r)描述,其中x,y表示其坐标,m是磁石的质量,p是磁力,r是吸引半径.若磁石A与磁石B的 ...
- CH#46A 磁力块
题意 磁力块 CH Round #46 - 「Adera 8」杯NOI模拟赛 描述 在一片广袤无垠的原野上,散落着N块磁石.每个磁石的性质可以用一个五元组(x,y,m,p,r)描述,其中x,y表示其坐 ...
- Contest Hunter #46 T1 磁力块 [分块]
描述 在一片广袤无垠的原野上,散落着N块磁石.每个磁石的性质可以用一个五元组(x,y,m,p,r)描述,其中x,y表示其坐标,m是磁石的质量,p是磁力,r是吸引半径.若磁石A与磁石B的距离不大于磁石A ...
- 『磁力块 bfs 分块』
磁力块 Description 在一片广袤无垠的原野上,散落着N 块磁石.每个磁石的性质可以用一个五元组 (x,y,m,p,r)描述,其中x,y 表示其坐标,m 是磁石的质量,p 是磁力,r 是吸引半 ...
- 【CHOJ】磁力块
题意描述 磁力块 在平面内分布着 \(N\) 个磁力块,同时你的手上也有一块. 你一开始站在给定的坐标上,当磁力块之间满足互相吸引的条件时就可以吸引. 当你拿到新的磁石时你就可以用它来吸引更多的石头, ...
- Contest Hunter #46 T1 磁力块 [花式暴力]
将所有石头按距离远近排序,将所有取到的时候扔进堆里维护最大磁力强度. 贪心,每次用强度最强的磁石尝试吸引地上的石头,扫完区间以后,这块石头就再也不会用到了. 在此基础上可以做些小优化,比如说优化未取石 ...
- CH Round #46A 磁力块
还是一道好题的 对于一个磁石是否被吸引,有两个关键字:距离和质量.(二维偏序??) 好像是很厉害的分块姿势,先按第一关键字排序,在块中按第二关键字排 进行bfs,对于当前磁石,有1~k-1个块是第一关 ...
- HDU 4391 - Paint The Wall - 分块哈希入门
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=4391 题意 : 给一段区间, 有两种操作 1 : 给 x 到 y 的区间染色为 z 2 : 查询 ...
- Java读取Level-1行情dbf文件极致优化(3)
最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1 ...
随机推荐
- 说说erlang tuple和record结构
erlang有两种复合结构.tuple和list,两者的区别是tuple子元素的个数是固定不变的.声明后就不能改变了.而list是可变的,能够通过[H|T]来取出或插入新元素. record有点像C/ ...
- 当使用 SelfHost 的 OWIN 承载 SignalR 时,重启 OWIN 后,SignalR 不能正常工作
需要在初始化时,重新对 Resolver 赋值一个新的实例: public class Startup { public void Configuration(IAppBuilder app) { v ...
- 【OCR技术系列之五】自然场景文本检测技术综述(CTPN, SegLink, EAST)
文字识别分为两个具体步骤:文字的检测和文字的识别,两者缺一不可,尤其是文字检测,是识别的前提条件,若文字都找不到,那何谈文字识别.今天我们首先来谈一下当今流行的文字检测技术有哪些. 文本检测不是一件简 ...
- Github上 10 个开源免费且优秀的后台控制面板(转)
https://github.com/ant-design/ant-design-pro https://mp.weixin.qq.com/s/Hn6hI-ubGw6N16nFzPdVLA
- 一文弄懂神经网络中的反向传播法(Backpropagation algorithm)
最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进 ...
- jq 日期区间处理
<html lang="en"><head> <meta charset="UTF-8"> <title>Tit ...
- 真正让HTML标签、DIV、SPAN拥有onfocus和onblur,聚焦和失焦
转载:http://blog.sina.com.cn/s/blog_7dfe67db01010lnq.html 默认火狐或者其他浏览器里DIV和其他普通标签是不具有onfocus和onblur事件的, ...
- 最方便最好看最好用的python日志。
这个日志没有依赖自己的其他包,复制即可运行,也可以从pypi网站上下载或者pip来安装这个日志. 1.日志内置了7种模板,其中模版4和模板5,可以实现点击日志跳转到指定文件指定行数的功能,史无前例的实 ...
- SQLSERVER查询那个表里有数据
declare @table table (rows int,tablename nvarchar(100));declare @sql NVARCHAR(MAX)declare @rows int; ...
- C++学习 —— 灵活的继承特性
0.继承与算法开发 在之前的笔记中,我展示了来自继承的威力.继承这种机制能够大幅度减小编码量,子类可以继承父类所有的变量,方法.利用这种机制,我们可以在其他人工作的基础上,完成有自己特色的部分.比如我 ...