题目

主人公一开始在一个位置用磁铁吸引其它磁铁,当磁铁的质量≤\leq≤磁力就会吸到主人公手里,不在主人公手里的磁铁不会互相吸引,主人公可以更换磁铁,但是只能原地不动,问主人公最多能吸到多少块磁铁


分析

这道题可以用广搜做,必然的暴力,但是问题是直接暴力会超时,怎么办?分块优化,用分块得到一个个区间,当然区间之间的排序用距离排序,区间内的排序用重量排序,然后,就没有然后了


代码

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
typedef long long ll; std::queue<int>q; bool v[250001];
struct rec{ll dis,rad; int m,p;}a[250001];
int X0,Y0,n,x,y,tot,l[511],r[511],ans; ll d[511];
ll in(){ll ans=0; int f=1; char c=getchar();while ((c<48||c>57)&&c!='-') c=getchar();if (c=='-') c=getchar(),f=-f;while (c>47&&c<58) ans=ans*10+c-48,c=getchar();return ans*f;
}
int min(int a,int b){return (a<b)?a:b;}
bool cmp1(const rec &a,const rec &b){return a.dis<b.dis;}
bool cmp2(const rec &a,const rec &b){return a.m<b.m;}
int main(){X0=in(); Y0=in(); a[0].p=in(); a[0].rad=in(); n=in(); a[0].rad*=a[0].rad;//以便比较for (register int i=1;i<=n;i++){x=in(); y=in(); a[i].m=in(); a[i].p=in(); a[i].rad=in();a[i].rad*=a[i].rad; a[i].dis=((ll)X0-x)*((ll)X0-x)+((ll)Y0-y)*((ll)Y0-y);//直线距离,为了精度,没开方}std::stable_sort(a+1,a+1+n,cmp1);for (register int i=1;i<=n;i+=500){l[++tot]=i; r[tot]=min(n,i+499);//区间左端点,区间右端点d[tot]=a[r[tot]].dis; std::stable_sort(a+l[tot],a+r[tot]+1,cmp2);//稍微排个序}q.push(0);while (q.size()){ll rr=a[q.front()].rad; int pp=a[q.front()].p; q.pop();for (register int i=1;i<=tot;i++){if (d[i]>rr){//距离不够(可能在里面)for (register int j=l[i];j<=r[i];j++)if (!v[j]&&a[j].dis<=rr&&a[j].m<=pp) v[j]=1,ans++,q.push(j);//每吸到一块磁铁增加1break;}while (l[i]<=r[i]&&a[l[i]].m<=pp){//吸吸吸吸if (!v[l[i]]) ans++,q.push(l[i]);l[i]++;}}}printf("%d",ans);return 0;
}

#广搜,分块#jzoj 3974 CH #46A 磁力块相关推荐

  1. 【题解】CH#46A 磁力块 分块+排序+队列

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

  2. 蓝书(算法竞赛进阶指南)刷题记录——CH#46A BZOJ3276 磁力块(bfs+分块)

    题目:CH#46A. 题目大意:有一个元素a0=(x0,y0,m0,p0,r0)a_0=(x_0,y_0,m_0,p_0,r_0)a0​=(x0​,y0​,m0​,p0​,r0​)和其它nnn个元素a ...

  3. poj 3131 Cubic Eight-Puzzle 双向广搜 Hash判重

    挺不错的题目,很锻炼代码能力和调试能力~ 题意:初始格子状态固定,给你移动后格子的状态,问最少需要多少步能到达,如果步数大于30,输出-1. 由于单向搜索状态太多,搜到二十几就会爆了,所以应该想到双向 ...

  4. 万圣节后的早晨九数码游戏——双向广搜

    https://www.luogu.org/problemnew/show/P1778 https://www.luogu.org/problemnew/show/P2578 双向广搜. 有固定起点终 ...

  5. Go 分布式学习利器(15) -- Go 实现 深搜和广搜

    强化语法,回顾算法. 通过Go语言实现 深度优先搜索 和 广度优先搜索,来查找社交网络中的三度好友关系(三度指的是一个节点到 其相邻节点 到 其相邻节点的节点 ,图递增三层好友关系). 涉及到的Go语 ...

  6. 搜索:广搜 词语阶梯

    问题描述以及解决过程如下导图 广搜实现如下 #include <iostream> #include <algorithm> #include <vector> # ...

  7. [NC23486]小A与小B 双向广搜

    题解:这个题属于走迷宫类型问题的一个升级版吧,不同之处在于一秒钟小A走一步,小B可以走两步,这两种事件是同时发生的,所以我们每秒钟让A扩散一步,让B扩散两步. 两个人走过的路径分别用 visited[ ...

  8. 【图论专题】BFS中的双向广搜 和 A-star

    双向广搜 AcWing 190. 字串变换 #include <cstring> #include <iostream> #include <algorithm> ...

  9. [数据结构] 迷宫问题(栈和队列,深搜和广搜)

    代码: #include <iostream> #include <string.h> #include <stack> #include <queue> ...

最新文章

  1. 用vector实现一个变长数组
  2. 第5章 Python 数字图像处理(DIP) - 图像复原与重建2 - 瑞利噪声
  3. linux下tmpfs文件系统简介
  4. 构造函数能默认初始化其静态成员么?
  5. html双击单元格修改,JS实现鼠标双击选中表格单元格代码
  6. 更改win11鼠标指针样式
  7. 数学期望方差 expectationvariance
  8. 电子计算机的指令是由什么和什么组成的,吴承亮问:计算机指令由两部分组成它们是 计算机指令由哪两个字段组成,各自的作用是什么?...
  9. ARM嵌入式体系结构与接口技术
  10. MarkDown中使用gif的神器:LICEcap
  11. 腾讯云服务器漏洞怎么修复,腾讯云安全中心监测到微软披露的99个漏洞,win系统云服务器用户尽快修复...
  12. Condition实现线程通信
  13. BIOS硬盘模式更改为AHCI模式,及更改后win10蓝屏的解决办法
  14. 模糊特征隶属度及图像增强相关
  15. unraid教程贴备忘
  16. OpenCV——line、circle、rectangle、ellipse、polylines函数的使用和绘制文本putText函数以及绘制中文的方法。
  17. 怎么理解产品经理职位?
  18. 七彩虹主板进BIOS设置和打开启动项菜单快捷键
  19. shell if 未找到命令
  20. linux查看其他用户history,从Linux服务器上的其他用户隐藏命令历史记...

热门文章

  1. 套接字(socket)通俗解
  2. 计算机可以不用电脑编程吗,围棋也能学编程?不用电脑就能玩的编程玩具!
  3. 十字星,影线,光脚阴线阳线
  4. 山东的计算机大专排名2015年,山东十大专科学校排名2021 山东最好的高职院校
  5. vue中输入框的限制,最多三位小数~~
  6. 超详细Redis数据库入门教程
  7. 评估指标(Metric)(三)
  8. 西门子PLC用TIA博途连接搜索后,可以搜到,但只有MAC地址,不显示IP地址,无法转至在线怎么办
  9. SQL 查找满足多个查询条件的行
  10. SpringBoot集成security(1)|(security入门)