热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【题解】袭击

题目链接题目描述在与联盟的战斗中屡战屡败后,帝国撤退到了最后一个据点。依靠其强大的防御系统,帝国击退了联盟的六波猛烈进攻。经过几天的苦思冥想,联盟将军亚瑟终于注意到帝国防御系

题目链接


题目描述


在与联盟的战斗中屡战屡败后,帝国撤退到了最后一个据点。

依靠其强大的防御系统,帝国击退了联盟的六波猛烈进攻。

经过几天的苦思冥想,联盟将军亚瑟终于注意到帝国防御系统唯一的弱点就是能源供应。

该系统由 \(N\) 个核电站供应能源,其中任何一个被摧毁都会使防御系统失效。

将军派出了 \(N\) 个特工进入据点之中,打算对能源站展开一次突袭。

不幸的是,由于受到了帝国空军的袭击,他们未能降落在预期位置。

作为一名经验丰富的将军,亚瑟很快意识到他需要重新安排突袭计划。

他现在最想知道的事情就是哪个特工距离其中任意一个发电站的距离最短。

你能帮他算出来这最短的距离是多少吗?



输入格式


输入中包含多组测试用例。

第一行输入整数 \(T\) ,代表测试用例的数量。

对于每个测试用例,第一行输入整数 \(N\)

接下来N行,每行输入两个整数 \(X\)\(Y\),代表每个核电站的位置的 \(X\)\(Y\) 坐标。

在接下来N行,每行输入两个整数X和Y,代表每名特工的位置的X,Y坐标。



输出格式


每个测试用例,输出一个最短距离值,结果保留三位小数。

每个输出结果占一行。



样例


样例输入

2
4
0 0
0 1
1 0
1 1
2 2
2 3
3 2
3 3
4
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0

样例输出

1.414
0.000

数据范围与提示

\(1\le N\le100000\)

\(0\le X,Y\le1000000000\)


Solution

分治。(不要问我怎么知道的)

铺垫 题解

好了,等你看完上面的部分,这题最妙的部分就不用我讲了,我就没事干了,本文终结。

对于同一个分组,它的最近点对我们可以这样求解:

将它按 \(x\) 优先, \(y\) 其次的规则从小到大排序,凡是看到关于坐标的不简单题,是个人都会先把 \(\operatorname{sort}\) 写上。可惜我不是人

那么,现在这个数组已经从左到右排好了,我们把它分成两半截。开始盗图

假设我们已经求出来了 \([left,mid]\) 的答案和 \([mid+1,right]\) 的答案,我们用 \(d\) (也就是记录答案的变量)记录它们的 \(\min\) 值。

但四!可爱的孩纸们,难道距离最近的就不可能在中间那一段吗?

在上图中:



  • 蓝色+紫色为答案可能区间1( \([left,mid]\) )

  • 紫色+橙色为答案可能区间2( 将求的值 )

  • 橙色+绿色为答案可能区间3( \([mid+1,right]\) )

那么,区间2如何处理呢?

上图中,紫色和橙色长方形的宽都是 \(d\),为什么呢?因为只有当它们的距离在 \(d\) 范围内, \(d\) 才有可能被更新,所以我们只用计算 \(l\) ~ \(r\) 中,\(x\) 坐标在 \([mid-d,mid+d]\) 范围内的点就行啦!

把满足上述要求的点放在 \(tmp\) 数组中,由于这个数组本身已经在范围内了,此时我们按 \(y\) 坐标排序,这样便于找到与某个点距离最近的点。

枚举 \(tmp\) 中的每一对点。当这一对点的 \(y\) 坐标的距离大于 \(d\) 时,我们就可以 \(break\) 掉了。因为已经按 \(y\) 坐标排好序, \(y\) 小的点太远,更大的自然不行。

但,这只是同一个分组的情况。不同分组其实也没有什么不同,就是在求距离的时候判一下就行了。

综上所述。。。


Code

#include
#include
#include
#include
using std::sort;
typedef double db;
const int maxn=1e5+5;
const db inf=DBL_MAX;
struct node{
db x,y;
bool type;
db operator-(const node q)const{
if(type==q.type)return inf;
return sqrt((x-q.x)*(x-q.x)+(y-q.y)*(y-q.y));
}
}a[maxn],tmp[maxn];
int T,n;
bool cmpx(node x,node y){
return x.x==y.x?x.y}
bool cmpy(node x,node y){
return x.y==y.y&&x.x}
db min(db x,db y){
return x}
db max(db x,db y){
return x>y?x:y;
}
db ll45l4(int l,int r){ //恶臭函数名
if(r-l<=1)return a[r]-a[l];
int mid=l+r>>1,cnt=0;
db d=min(ll45l4(l,mid),ll45l4(mid+1,r));
for(int i=l;i<=r;++i){
if(a[mid].x-d<=a[i].x&&a[mid].x+d>=a[i].x)
tmp[++cnt]=a[i];
}
sort(tmp+1,tmp+cnt+1,cmpy);
for(int i=1;i<=cnt;++i){
for(int j=i+1;j<=cnt;++j){
if(a[j].y-a[i].y>d)break;
d=min(d,a[i]-a[j]);
}
}
return d;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%lf%lf",&a[i].x,&a[i].y);
a[i].type=0;
}
for(int i=1;i<=n;++i){
scanf("%lf%lf",&a[n+i].x,&a[n+i].y);
a[i].type=1;
}
n<<=1;
sort(a+1,a+n+1,cmpx);
printf("%.3lf\n",ll45l4(1,n));
}
return 0;
}

end.

—— · EOF · ——

千里之行,始于足下



推荐阅读
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • Yii 实现阿里云短信发送 ... [详细]
  • 使用Numpy实现无外部库依赖的双线性插值图像缩放
    本文介绍如何仅使用Numpy库,通过双线性插值方法实现图像的高效缩放,避免了对OpenCV等图像处理库的依赖。文中详细解释了算法原理,并提供了完整的代码示例。 ... [详细]
  • LeetCode 540:有序数组中的唯一元素
    来源:力扣(LeetCode),链接:https://leetcode-cn.com/problems/single-element-in-a-sorted-array。题目要求在仅包含整数的有序数组中,找到唯一出现一次的元素,并确保算法的时间复杂度为 O(log n) 和空间复杂度为 O(1)。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
author-avatar
Lo海豚
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有