磁力块

news/2024/11/22 19:13:24/

题目链接
在一片广袤无垠的原野上,散落着 N N N块磁石。

每个磁石的性质可以用一个五元组 ( x , y , m , p , r ) (x,y,m,p,r) (x,y,m,p,r)描述,其中 x , y x,y x,y表示其坐标, m m m是磁石的质量, p p p是磁力, r r r是吸引半径。

若磁石 A A A与磁石 B B B的距离不大于磁石 A A A的吸引半径,并且磁石 B B B的质量不大于磁石 A A A的磁力,那么 A A A可以吸引 B B B

小取酒带着一块自己的磁石 L L L来到了这片原野的 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)处,我们可以视磁石 L L L的坐标为 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)

小取酒手持磁石 L L L并保持原地不动,所有可以被 L L L吸引的磁石将会被吸引过来。

在每个时刻,他可以选择更换任意一块自己已经获得的磁石(当然也可以是自己最初携带的 L L L磁石)在 ( x 0 , y 0 ) (x0,y0) (x0,y0)处吸引更多的磁石。

小取酒想知道,他最多能获得多少块磁石呢?

输入格式
第一行五个整数 x 0 , y 0 , p L , r L , N x_0,y_0,p_L,r_L,N x0,y0,pL,rL,N,表示小取酒所在的位置,磁石L磁力、吸引半径和原野上散落磁石的个数。

接下来 N N N行每行五个整数 x , y , m , p , r x,y,m,p,r x,y,m,p,r,描述一块磁石的性质。

输出格式
输出一个整数,表示最多可以获得的散落磁石个数(不包含最初携带的磁石L)。

数据范围
1 ≤ N ≤ 250000 1≤N≤250000 1N250000,
− 1 0 9 ≤ x , y ≤ 1 0 9 −10^9≤x,y≤10 ^9 109x,y109,
1 ≤ m , p , r ≤ 1 0 9 1≤m,p,r≤10^9 1m,p,r109

输入样例:
0 0 5 10 5
5 4 7 11 5
-7 1 4 7 8
0 2 13 5 6
2 -3 9 3 4
13 5 1 9 9

输出样例:

3

先将数据按 m m m由小到大排序,分为 n \sqrt n n 块,然后对于每块内按到 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)的距离 d d d由小到大排序,这样对于获得的每个磁力块,在 p p p大于等于 m m a x m_{max} mmax的块内扫描,对于第一个 p p p小于 m m a x m_{max} mmax的块遍历,最终时间复杂度为 O ( n n ) O(n\sqrt n) O(nn )

#include<bits/stdc++.h>#define pi(a) printf("%d\n",a)
#define repi(i, a, b) for(register int i=a;i<=b;++i)
#define ll long long
#define fi first
#define se secondusing namespace std;inline int qr() {int f = 0, fu = 1;char c = getchar();while (c < '0' || c > '9') {if (c == '-')fu = -1;c = getchar();}while (c >= '0' && c <= '9') {f = (f << 3) + (f << 1) + c - 48;c = getchar();}return f * fu;
}const int N = 250010;
struct sta {int m, p;ll r, d;
} a[N];inline bool cmpd(sta x, sta y) {return x.d < y.d;
}inline bool cmpm(sta x, sta y) {return x.m < y.m;
}struct BLOCK {int L[N], R[N], pos[N], P[N], mx[N];int n, t, len;bool v[N];inline void build(int _n, int _len) {int now = 0;n = _n, len = _len, t = 0;sort(a + 1, a + 1 + n, cmpm);while (now + len <= n)L[++t] = now + 1, R[t] = now + len, P[t] = now, now += len;if (now < n)L[++t] = now + 1, R[t] = n, P[t] = now;for (int i = 1; i <= t; i++) {for (int j = L[i]; j <= R[i]; j++)pos[j] = i;mx[i] = a[R[i]].m;sort(a + L[i], a + R[i] + 1, cmpd);}}inline int work(int p, ll r, queue<pair<int, ll>> &q) {int res = 0;for (int i = 1; i <= t; i++) {if (p >= mx[i])while (P[i] + 1 <= R[i] && a[P[i] + 1].d <= r) {P[i]++;if (!v[P[i]])q.push({a[P[i]].p, a[P[i]].r}), res++;}else {repi(j, P[i] + 1, R[i])if (!v[j] && a[j].m <= p && a[j].d <= r)q.push({a[j].p, a[j].r}), v[j] = true, res++;break;}}return res;}
} B;int x, y, p, n;
ll r;
queue<pair<int, ll>> q;int main() {x = qr(), y = qr(), p = qr(), r = qr(), n = qr();repi(i, 1, n) {int _x = qr(), _y = qr();a[i].d = 1ll * (x - _x) * (x - _x) + 1ll * (y - _y) * (y - _y);a[i].m = qr(), a[i].p = qr();ll _r = qr();a[i].r = _r * _r;}B.build(n, sqrt(n));q.push({p, 1ll * r * r});int ans = 0;while (!q.empty()) {auto t = q.front();q.pop();ans += B.work(t.fi, t.se, q);}pi(ans);return 0;
}

http://www.ppmy.cn/news/789075.html

相关文章

基于matlab使用激光雷达检测地平面和障碍物(附源码)

一、前言 此示例演示如何通过分割地平面并查找附近的障碍物来处理来自安装在车辆上的传感器的 3-D 激光雷达数据。这可以促进车辆导航的可驾驶路径规划。该示例还演示如何可视化流式激光雷达数据。 二、创建 Velodyne 文件读取器 本例中使用的激光雷达数据是使用安装在车辆上…

find和grep各个参数

find 功能&#xff1a;在目录结构中搜索文件&#xff0c;并执行指定的操作。此命令提供了相当多的查找条件&#xff0c;功能很强大。 语法: find 查找位置 匹配文件名 说明&#xff1a;find命令从指定的起始目录开始&#xff0c;递归地搜索其各个子目录&#xff0c;查找满足…

开源免费录屏软件整理

百度了好多软件&#xff0c;大多限制时间或者质量不好或者有水印&#xff0c;以下三款无水印、无广告、清晰度高&#xff0c;记录以下。 1.ScreenToGif gif短动画录制 它的Github开源项目地址在这里&#xff0c;下载地址在这里。 2.Captura 这个录制视频有声音&#xff0c…

电脑录屏用什么软件?推荐这3款软件,用过都说好

如今网络中&#xff0c;有很多的软件都能够实现电脑录屏。但想要找一个方便好用的电脑录屏软件却十分困难。电脑录屏用什么软件&#xff1f;今天小编将为小伙伴分享3款超级方便好用的电脑录屏软件&#xff0c;用过的小伙伴都说好&#xff01;一起来看看吧。 电脑录屏软件1&…

6种电脑录屏工具,免费在线,桌面端Windows和Mac均适用

如果你想做一个教程类博主&#xff0c;不管是游戏类的&#xff0c;科技类的&#xff0c;还是语言类的&#xff0c;你首先需要一个不错的电脑录屏工具。自自媒体大流行开始以来&#xff0c;对电脑屏幕录制的需求有不断增长。来自不同领域的专业人士&#xff0c;例如教育领域的专…

电脑录屏免费软件gif等格式视频

目录 1. 免费开源的GIF录制工具ScreenToGif2. GifCam - 简单好用的 GIF 动画录制软件3. LICEcap – 灵活好用&#xff0c;GIF 屏幕录制工具 1. 免费开源的GIF录制工具ScreenToGif 官网地址 2. GifCam - 简单好用的 GIF 动画录制软件 官网地址 3. LICEcap – 灵活好用&#…

进程间通信方法——匿名管道

什么是管道&#xff1f; 管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道” 什么是匿名管道 就是一个没有名字的管道。 #include <unistd.h> 功能:创建一无名管道 原型 int pipe(int fd[2]); 参数 fd&#xff1a;文…

ChatGPT在游戏开发中的应用如何?

ChatGPT在游戏开发中具有广泛的应用潜力&#xff0c;可以提供多方面的支持和改进。以下是ChatGPT在游戏开发中的一些应用场景&#xff1a; 1. 任务和剧情生成&#xff1a;ChatGPT可以帮助游戏开发人员生成丰富多样的任务和剧情内容。它可以分析游戏世界的规则和玩家的动作&…