平面最近点对

平面最近点对(加强加强版)

题目背景

P1429 平面最近点对(加强版)里最高赞题解写道:

我们充分发扬人类智慧:
将所有点全部绕原点旋转同一个角度,然后按 x x x 坐标排序
根据数学直觉,在随机旋转后,答案中的两个点在数组中肯定不会离得太远
所以我们只取每个点向后的 5 5 5 个点来计算答案
这样速度快得飞起,在 n = 1000000 n=1000000 n=1000000 时都可以在 1 s 内卡过

当然,这是错的。

题目描述

给定 n n n 个二维欧几里得平面上的点 p 1 , p 2 , … , p n p_1, p_2, \dots, p_n p1,p2,,pn,请输出距离最近的两个点的距离。

输入格式

输入第一行为一个正整数 n n n,表示点数。

接下来 n n n 行,第 i i i 行为用空格隔开的整数 x i , y i x_i, y_i xi,yi,表示 p i = ( x i , y i ) p_i = (x_i, y_i) pi=(xi,yi)

输入保证:没有两个坐标完全相同的点。

输出格式

输出一行,包含一个整数 D 2 D^2 D2,表示距离最近的两个点的距离的平方

由于输入的点为整点,因此这个值一定是整数。

样例 #1

样例输入 #1

2
-10000000 -10000000
10000000 10000000

样例输出 #1

800000000000000

样例 #2

样例输入 #2

5
1 1
1 9
9 1
9 9
0 10

样例输出 #2

2

提示

对于第二组样例, ( 1 , 9 ) (1, 9) (1,9) ( 0 , 10 ) (0, 10) (0,10) 两个点最近,距离为 2 \sqrt 2 2 ,因此你需要输出 2 2 2

数据范围

对于 100 % 100 \% 100% 的数据, 2 ≤ n ≤ 4 × 1 0 5 2 \leq n \leq 4 \times 10^5 2n4×105 − 1 0 7 ≤ x i , y i ≤ 1 0 7 -10^7 \leq x_i, y_i \leq 10^7 107xi,yi107

本题目标复杂度是 O ( n log ⁡ 2 n ) O(n \log ^2 n) O(nlog2n)。设置 350ms 时限的原因是:

  1. O ( n log ⁡ 2 n ) O(n \log ^2 n) O(nlog2n) 参考代码使用 cin 不会 TLE。最快的 std 能 < < < 100ms。
  2. @wlzhouzhuan 的程序能恰好在 350ms 内跑 1000 n 1000n 1000n 次检查。
  3. 150 组测试数据,为了防止卡评测。

分析

典型分治题,我们二分求解,会得到左右两侧的最小值,考虑跨越中心线时的答案,其横纵坐标差均小于d才可能为正确答案

代码

#include <bits/stdc++.h>
using namespace std;
const int M=4*1e5+10;
#define int long long
pair<int,int> a[M];
int n;
int d=1e16;
pair<int,int> vl[M],vr[M];
void read(){ios::sync_with_stdio(false);cin>>n;for (int i=1;i<=n;i++)cin>>a[i].first>>a[i].second;
}
int dis2(pair<int,int> a,pair<int,int> b){return (a.first - b.first) * (a.first - b.first) + 1ll * (a.second - b.second) * (a.second - b.second);
}
void solve(int l,int r){if (l==r){swap(a[l].first,a[l].second);return;}int mid=l+r>>1;int x=a[mid].first;solve(l,mid);solve(mid+1,r);double dis=sqrt(d);int sl=0,sr=0;for (int i=l;i<=mid;i++)if (x-a[i].second<dis) vl[++sl]=a[i];for (int i=mid+1;i<=r;i++)if(a[i].second-x<dis) vr[++sr]=a[i];int p=1,q=0;for (int i=1;i<=sl;i++){while(p<=sr and vl[i].first-vr[p].first>=dis) p++;while(q<sr and vr[q+1].first-vl[i].first<dis) q++;for (int j=p;j<=q;j++) d=min(d,dis2(vl[i],vr[j]));}inplace_merge(a+l,a+mid+1,a+r+1);
}
signed main() {read();sort(a+1,a+n+1);solve(1,n);cout<<d<<endl;return 0;
}

分析

	if (l==r){swap(a[l].first,a[l].second);return;}

翻转pair的first与second,便于按y排序

for (int i=l;i<=mid;i++)if (x-a[i].second<dis) vl[++sl]=a[i];for (int i=mid+1;i<=r;i++)if(a[i].second-x<dis) vr[++sr]=a[i];

选取在x上符合要求的点

for (int i=1;i<=sl;i++){while(p<=sr and vl[i].first-vr[p].first>=dis) p++;while(q<sr and vr[q+1].first-vl[i].first<dis) q++;for (int j=p;j<=q;j++) d=min(d,dis2(vl[i],vr[j]));}

选取在y上符合要求的点

inplace_merge(a+l,a+mid+1,a+r+1);

选完后,方便上一层调用,使用归并

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/20059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【图像分类】CNN+Transformer结合系列.2

介绍几篇利用CNNTransformer实现图像分类的论文&#xff1a;CMT&#xff08;CVPR2022&#xff09;&#xff0c;MaxViT(ECCV2022)&#xff0c;MaxViT&#xff08;ECCV2022&#xff09;&#xff0c;MPViT&#xff08;CVPR2022&#xff09;。主要是说明Transformer的局限性&#x…

Vue+Nodejs+Express+Minio 实现本地图片上传

安装Minio,Minio server和Minio client都要下载可以自定义安装目录 安装完成之后,可以将minio配置成环境变量方便使用 配置了环境变量启动命令式 minio server start,默认账号密码minioadmin和minioadmin,点击9000端口的这个链接,即可访问客户端 nodejs连接Minio,简易服务进…

顺序表、链表刷题指南(力扣OJ)

目录 前言 题目一&#xff1a;删除有序数组中的重复项 思路&#xff1a; 题解&#xff1a; 题目二&#xff1a;合并两个有序数组 思路&#xff1a; 分析&#xff1a; 题解&#xff1a; 题目三&#xff1a;反转链表 思路&#xff1a; 分析&#xff1a; 题解&#xff1a; 题目四&…

位移运算使用技巧

位移运算使用技巧 左位移 <<右位移>> 左位移 << 将二进制数向左位移操作,高位溢出则丢弃,地位补0 int a 11; int b a << 1; //b 22 // 位移前: 0000 1011 // 位移后: 0001 0110int b 5; int c b << 2; //c 20结论: 对一个数左移1位就是乘…

springboot自定义错误消息

为了提供自定义错误消息提示&#xff0c;springboot在resources目录下&#xff0c;有一个文件ValidationMessages.properties 用于存储 验证错误的消息提示&#xff1a; 比如&#xff1a; 这样一个ValidationMessage.properties username.notempty用户名不能为空 username.len…

如何压缩高清PDF文件大小?将PDF文件压缩到最小的三个方法

PDF格式是一种非常常用的文档格式&#xff0c;但是有时候我们需要将PDF文件压缩为更小的大小以便于传输和存储。在本文中&#xff0c;我们将介绍三种PDF压缩的方法&#xff0c;包括在线PDF压缩、利用软件PDF压缩以及使用WPS缩小pdf。 首先&#xff0c;在线PDF压缩是最常用的方…

蓝桥杯上岸每日N题 第四期(最少刷题数)!!!

蓝桥杯上岸每日N题第四期 ❗️ ❗️ ❗️ 最少刷题数 同步收录 &#x1f447; 蓝桥杯上岸必背&#xff01;&#xff01;&#xff01;(持续更新中~) 大家好 我是寸铁&#x1f4aa; 冲刺蓝桥杯省一模板大全来啦 &#x1f525; 蓝桥杯4月8号就要开始了 &#x1f64f; 距离蓝…

华云安参编的《云原生安全配置基线规范》正式发布

由中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;、中国通信标准化协会主办的第十届可信云大会云原生安全分论坛于7月26日在北京国际会议中心成功召开。作为大会上展示的成果之一&#xff0c;由中国信通院联合行业领先企业共同编写的《云原生安全配置基线规…

寒假作业(蓝桥杯2016年省赛C++A组第6题 )

题目&#xff1a; 注&#xff1a;蓝桥杯2016年省赛CA组第6题 请填写表示方案数目的整数。 题解&#xff1a; 由题可知这是一道全排列问题&#xff0c;因此我们可以使用c的next_permutation函数对于1-13的数字进行全排列即可&#xff0c;并每次排列判断是否满足题意。 注意…

How to Use Glslang

文章目录 Execution of Standalone Wrapper构建 (CMake)依赖关系构建步骤如果需要更改 GLSL 语法测试运行测试基本内部操作 Execution of Standalone Wrapper 要使用独立的二进制形式&#xff0c;请执行glslang&#xff0c;它将打印一条使用语句。基本操作是给它一个包含着色器…

WordPress做权重站:二级目录伪静态写法

我喜欢用WordPress建站&#xff0c;但是每个网站我都会写3个以上的二级目录&#xff0c;为什么了&#xff0c;因为WordPress数据量过大会导致数据库很大很卡&#xff0c;所以这种做法可以减轻数据库的负荷。我一般每个目录的文章达到15万篇就不会再更新了&#xff0c;3个目录加…

无边界野望:高通也有痛点?

外界给予高通的称呼无非是性价屠夫&#xff0c;因为即可“拳打”联发科&#xff0c;又能四度包下上海ChinaJoy展馆做游戏技术支持的王者&#xff0c;对高通来说它的路是无边界的&#xff0c;也是跨界之路上前行的“诗和远方”。 这里&#xff0c;既有生成式AI在终端侧布局、与…

React之组件的生命周期

React之组件的生命周期 一、概述二、整体说明三、挂载阶段四、更新阶段五、卸载阶段 一、概述 生命周期:一个事务从创建到最后消亡经历的整个过程组件的生命周期&#xff1a;组件从被创建到挂载到页面中运行&#xff0c;再到组件不用时卸载的过程意义&#xff1a;理解组件的生…

使用IPSEC VPN 在有防火墙的场景和有NAT转换的场景下实现隧道通信实验

目录 一、在有防火墙的场景 1、为所有设备配置对应ip地址&#xff1a; 2、进入两个防火墙实现公网互通 3、测试公网是否互通 4、进入SW1配置IPSEC VPN 5、进入SW2配置IPSEC VPN 6、配置策略方向ESP的流量 7、尝试使用PC1访问PC2 二、在有NAT地址转换的场景 1、为新增加…

视频号将不支持添加企业微信:私域流量受阻

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 以前大家一直嚷嚷着说微信视频号企业微信私域流量神器&#xff0c;这下好了&#xff0c;从今日起这个功能没了&#xff0c;以后新的视频号不能绑定企业微信了&#xff0c;但老视频号还可以。 昨天…

golang mongodb

看代码吧 package main// 链接案例 https://www.mongodb.com/docs/drivers/go/current/fundamentals/connection/#connection-example // 快速入门 https://www.mongodb.com/docs/drivers/go/current/quick-start/ import ("context""fmt""log"…

招投标系统简介 招投标系统源码 java招投标系统 招投标系统功能设计

&#xfeff;功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&…

c++游戏框架

游戏类 class Sprite { public:Sprite(int x, int y, int w, int h, const char* imagePath);~Sprite();void render(SDL_Renderer* renderer);void move(int x, int y); private:SDL_Texture* texture_;SDL_Rect rect_; }; 物理引擎类 class PhysicsEngine { public:Physi…

【数据结构】二叉树、二叉搜索树、平衡二叉树、红黑树、B树、B+树

概述 二叉树&#xff08;Binary Tree&#xff09;&#xff1a;每个节点最多有两个子节点&#xff08;左子节点和右子节点&#xff09;&#xff0c;没有限制节点的顺序。特点是简单直观&#xff0c;易于实现&#xff0c;但查找效率较低。 二叉搜索树&#xff08;Binary Search…

Redis设置hash,为不同的field设置不同的过期时间

Redis设置hash&#xff0c;为不同的field设置不同的过期时间 一、背景需求二、具体要求三、代码实现 一、背景需求 最近做了一个小需求&#xff0c;由于系统对接&#xff0c;导致我们的系统在高峰的时候CPU飙升&#xff0c;所以需要在高峰的时候保护系统进程不受影响。 而且还…