250. 磁力块

news/2024/12/28 14:15:49/

题目链接:250. 磁力块

算法分析

先按照质量排序,然后分块,在每块内再按照距离排序。每块大小 n \sqrt n n 。计算出一个k,满足[1,k]块内的每个磁石的质量都小于等于队头的磁石的磁力。最坏的情况下,会换 n n n次磁石,总共会有 n n n块磁石入队,因此均摊时间复杂度是O(1),暴力计算第 k + 1 k+1 k+1块的时候,复杂度是 O ( n ) O(\sqrt n) O(n )。因此,总复杂度是 O ( n ∗ n ) O(n*\sqrt n) O(nn )

在计算 k k k的时候,可以优化。存下每块内磁石的最大质量,因为之前是排序的,因此这个数据是有序的,可以二分查找出这个k。同样地,在每块内部计算距离小于队头半径的磁石时,也可以二分,但此题时间宽裕,两个二分都不用也能过。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
#define ll long long 
const int N = 250010;
struct Stone
{ll x, y, m, p, r;ll bl;double dis;
}st[N];
ll n, xx, yy, pl, rl;
int blo, ans;
int vis[N];
struct kuai
{ll maxm, l;
}b[550];
queue<Stone> q;
inline ll re()
{ll x = 0, f = 1; char c = getchar();while (c < '0' || c > '9'){if (c == '-') f= -1; c = getchar();}while (c >= '0' && c <= '9'){x = x * 10 + c - '0'; c = getchar();}return x * f; 
}
bool cmp(Stone a, Stone b)
{return a.m < b.m;
}
bool cmp1(Stone a, Stone b)
{if (a.bl == b.bl) return a.dis < b.dis;else return a.bl < b.bl;
}
bool chk(int mid, int p)
{return b[mid].maxm <= p;
}
int szfind(int p)  // 在所有块中查找小于等于p的最大值  
{int l = 0, r = st[n].bl;while (l < r){int mid = (l + r + 1) >> 1;if (chk(mid, p)) l = mid; else r = mid - 1;}return l;
}
int main()
{xx = re(); yy = re(); pl = re(); rl = re(); n = re();for (int i = 1; i <= n; ++i){st[i].x = re(); st[i].y = re(); st[i].m = re(); st[i].p = re(); st[i].r = re();st[i].dis = sqrt((st[i].x - xx) * (st[i].x - xx) + (st[i].y - yy) * (st[i].y - yy));}blo = sqrt(n);sort(st + 1, st + n + 1, cmp);  // 按质量由小到大排序  for (int i = 1; i <= n; ++i) st[i].bl = (i - 1) / blo + 1;for (int i = 1; i <= st[n].bl - 1; ++i){b[i].l = (i - 1) * blo +1; // 记录每块的最左边的位置  b[i].maxm = st[i*blo].m;  // 记录每块的最大质量  }b[st[n].bl].l = (st[n].bl - 1) * blo + 1;b[st[n].bl].maxm = st[n].m;sort(st + 1, st + n + 1, cmp1); // 同一块内按距离由小到大排序  Stone tem;tem.x = xx; tem.y = yy; tem.p = pl; tem.r = rl;q.push(tem);while (!q.empty()){Stone u = q.front(); q.pop();	int k = szfind(u.p); // [1,k]块都是最大质量小于等于u.p的 for (int t = 1; t <= k; ++t){int j;for (j = b[t].l; j <= min((ll)t * blo, n); ++j)if (st[j].dis <= u.r){if (!vis[j]){++ans; q.push(st[j]); vis[j] = 1;}					}else break;b[t].l = j;}// 暴力计算第k+1个块 if (k != st[n].bl)  // 需要判断k是否是最后一个块  {int j;for (j = b[k+1].l; j <= min((ll)(k + 1) * blo, n); ++j)if (st[j].dis <= u.r){if (st[j].m <= u.p && !vis[j]){++ans; q.push(st[j]); vis[j] = 1;}}else break;}		}printf("%d\n", ans);return 0;
}

总结与反思

  1. 此题细节很多。在二分查找k时,要将左端点 l l l置为0,如果k为0的话,可以正确取值,否则不能正确取值。在暴力计算第 k + 1 k+1 k+1块时,要判断 k k k是否是最后一块,如果是最后一块,就不能在计算第 k + 1 k+1 k+1块了,否则又要错误。光debug这个错误,用了将近一天的时间。

  2. 数据设定为long long了,但是快读的时候忘开long long。

  3. 代码可以再精简的,比如存下 L [ i ] L[i] L[i] R [ i ] R[i] R[i],作为每块的左右端点,更清晰些;在入队列的时候,可以让下标 i i i入队列,不用整个结构体 s t [ i ] st[i] st[i]都入。


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

相关文章

【STM32+cubemx】0029 HAL库开发:HMC5883L磁力计的应用(电子指南针)

今天我们来学习电子磁力计HMC5883L的使用。先介绍磁力计的基础知识&#xff0c;再给一个获取磁力计数据的例子&#xff0c;最后讲解HMC5883L磁力计的校准&#xff0c;以及一些使用中的经验。 1&#xff09;HMC5883L磁力计的基础知识 磁力计是用来测量磁场强弱&#xff08;也就…

RestClient操作索引库

一、初始化RestClient 分为三步&#xff1a; 1&#xff09;引入es的RestHighLevelClient依赖&#xff1a; <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dep…

MATLAB校准磁力计

初识magcal函数 语法 [A,b,expmfs] magcal(D) [A,b,expmfs] magcal(D,fitkind) 描述 [A&#xff0c;b&#xff0c;expmfs] magcal&#xff08;D&#xff09; 返回校正未校准磁力计数据所需的数据D。要产生校准的磁力计数据&#xff0c;请使用该公式。校准后的数据CC (D-b)*…

国产磁力架的用途,特点和使用方法

磁力架的用途&#xff1a; 磁力架可快速将磁珠结合样本吸附至试管壁&#xff0c;与磁珠配合使用&#xff0c;可实现任何目标物的分离。 Mich Scientific磁力架的特点&#xff1a; 适用性广&#xff1a;可用于1.5ml,2ml,15ml,50ml,0.2ml离心管&#xff0c;PCR单管&#xff0c;8…

磁场强度H,磁感应强度(磁通密度)B的区别

参考资料&#xff1a; 磁场强度H&#xff0c;磁感应强度B有什么区别&#xff1f;各自代表什么意义&#xff1f;_知乎&#xff1a;Wavefunction 假设有一个虚无空间&#xff0c;里面任何物质都没有&#xff0c;连真空也没有&#xff08;有点荒谬但便于理解&#xff09;&#xff…

基于Matlab的磁力计校准(附源码)

目录 一、理想磁力计 二、硬铁效应 三、软铁效应 四、校正技术 五、使用函数magcal 5.1 仅偏移计算 ​编辑5.2 硬铁补偿和轴缩放计算 5.3 全硬铁和软铁补偿 5.4 自动拟合 六、 结论 七、程序 磁力计沿传感器的 X、Y 和 Z 轴检测磁场强度。精确的磁场测量对于传感器融合以…

BGNet

为此&#xff0c;在本文中&#xff0c;我们提出了一种新的边界引导网络&#xff08;BGNet&#xff09;&#xff0c;它显式地使用边缘语义来增强伪装对象检测的性能。首先&#xff0c;我们设计了一个简单而有效的边缘感知模块&#xff08;EAM&#xff09;&#xff0c;它集成了低…

地磁场与磁力计

地磁场与磁力计&#xff08;电子罗盘&#xff0c;指南针&#xff09;的使用 1. 地磁场介绍 主要围绕 matlab里的地磁场 模型&#xff08;World Magnetic Model&#xff09;来介绍。 该模型的输入为&#xff1a;经度&#xff0c;纬度&#xff0c;高度&#xff0c;年份 输出为&…