[caioj1206][kdtree]最近点对的距离

2023-10-16 04:18
文章标签 距离 最近 kdtree caioj1206

本文主要是介绍[caioj1206][kdtree]最近点对的距离,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【题意】

给出n个点的坐标,求最近两点间的距离。

【输入格式】

第一行一个整数n(2 ≤ n ≤ 50000)。 下来n行,每行两个实数x和y表示点坐标。

【输出格式】

一行一个实数,表示最近两点间的距离(保留4位小数)。

【样例输入】

5
0 0
0 5
5 0
5 5
2 0

【样例输出】

2.0000

题解

扔一个欧几里得最短距离的模板
直接上kdtree
注意如果搜到自己了,那么不继承

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
struct node
{LL mx[2],mn[2],d[2];int lc,rc;node(){lc=rc=0;}
}tr[210000];int trlen;
void update(int x)
{int lc=tr[x].lc,rc=tr[x].rc;if(lc){tr[x].mx[0]=max(tr[x].mx[0],tr[lc].mx[0]);tr[x].mn[0]=min(tr[x].mn[0],tr[lc].mn[0]);tr[x].mx[1]=max(tr[x].mx[1],tr[lc].mx[1]);tr[x].mn[1]=min(tr[x].mn[1],tr[lc].mn[1]);}if(rc){tr[x].mx[0]=max(tr[x].mx[0],tr[rc].mx[0]);tr[x].mn[0]=min(tr[x].mn[0],tr[rc].mn[0]);tr[x].mx[1]=max(tr[x].mx[1],tr[rc].mx[1]);tr[x].mn[1]=min(tr[x].mn[1],tr[rc].mn[1]);}
}
int cmpd;
bool cmp(node n1,node n2)
{return n1.d[cmpd]<n2.d[cmpd] || n1.d[cmpd]==n2.d[cmpd] && n1.d[cmpd^1]<n2.d[cmpd^1];
}
int bt(int l,int r,int d)
{int mid=(l+r)/2;int now;cmpd=d;now=mid;nth_element(tr+l,tr+mid,tr+r+1,cmp);tr[now].mx[0]=tr[now].mn[0]=tr[now].d[0];tr[now].mx[1]=tr[now].mn[1]=tr[now].d[1];if(l<mid)tr[now].lc=bt(l,mid-1,d^1);if(mid<r)tr[now].rc=bt(mid+1,r,d^1);update(now);return now;
}
LL nowx,nowy;int root,n;
LL minn;
LL sqr(LL x){return (x*x);}
LL dismin(int now,LL x,LL y)
{LL ans=0;if(x<tr[now].mn[0])ans+=sqr(tr[now].mn[0]-x);if(x>tr[now].mx[0])ans+=sqr(x-tr[now].mx[0]);if(y<tr[now].mn[1])ans+=sqr(tr[now].mn[1]-y);if(y>tr[now].mx[1])ans+=sqr(y-tr[now].mx[1]);return ans;
}
void solmin(int now)
{LL d0=((tr[now].d[0]-nowx)*(tr[now].d[0]-nowx)+(tr[now].d[1]-nowy)*(tr[now].d[1]-nowy));if(d0)minn=min(minn,d0);LL d1=4e18,d2=4e18;if(tr[now].lc)d1=dismin(tr[now].lc,nowx,nowy);if(tr[now].rc)d2=dismin(tr[now].rc,nowx,nowy);if(d1<d2){if(d1<minn)solmin(tr[now].lc);if(d2<minn)solmin(tr[now].rc);}else{if(d2<minn)solmin(tr[now].rc);if(d1<minn)solmin(tr[now].lc);}
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%lld%lld",&tr[i].d[0],&tr[i].d[1]);root=bt(1,n,0);minn=4e18;for(int i=1;i<=n;i++){nowx=tr[i].d[0];nowy=tr[i].d[1];solmin(root);}printf("%.4lf\n",sqrt(double(minn)));return 0;
}

这篇关于[caioj1206][kdtree]最近点对的距离的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/218975

相关文章

poj1330(LCA最近公共祖先)

题意:求最近公共祖先 思路:之前学习了树链剖分,然后我就用树链剖分的一小部分知识就可以解这个题目了,记录每个结点的fa和depth。然后查找时,每次将depth大的结点往上走直到x = y。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>

最近心情有点复杂:论心态

一月一次的彷徨又占据了整个身心;彷徨源至不自信;而不自信则是感觉自己的价值没有很好的实现亦或者说是自己不认可自己的目前的生活和状态吧。 我始终相信一句话:任何人的生活形态完全是由自己决定的;外在的总归不能直达一个人的内心深处。所以少年 为了自己想要的生活 多坚持努力吧、不为别人只为自己心中的那一丝执着。 由此我看到了一个故事: 一个心情烦躁的人去拜访禅师。他问禅师:我这辈子就这么注定了吗?您

线性代数|机器学习-P35距离矩阵和普鲁克问题

文章目录 1. 距离矩阵2. 正交普鲁克问题3. 实例说明 1. 距离矩阵 假设有三个点 x 1 , x 2 , x 3 x_1,x_2,x_3 x1​,x2​,x3​,三个点距离如下: ∣ ∣ x 1 − x 2 ∣ ∣ 2 = 1 , ∣ ∣ x 2 − x 3 ∣ ∣ 2 = 1 , ∣ ∣ x 1 − x 3 ∣ ∣ 2 = 6 \begin{equation} ||x

在二叉树中找到两个节点的最近公共祖先(基于Java)

如题  题解 public int lowestCommonAncestor(TreeNode root, int o1, int o2) {//记录遍历到的每个节点的父节点。Map<Integer, Integer> parent = new HashMap<>();Queue<TreeNode> queue = new LinkedList<>();parent.put(roo

模拟退火求n个点到某点距离和最短

/*找出一个点使得这个店到n个点的最长距离最短,即求最小覆盖圆的半径用一个点往各个方向扩展,如果结果更优,则继续以当前步长扩展,否则缩小步长*/#include<stdio.h>#include<math.h>#include<string.h>const double pi = acos(-1.0);struct point {double x,y;}p[1010];int

黑神话:悟空》增加草地绘制距离MOD使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验

《黑神话:悟空》增加草地绘制距离MOD为玩家提供了一种全新的视觉体验,通过扩展游戏中草地的绘制距离,增加了场景的深度和真实感。该MOD通过增加草地的绘制距离,使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验。 增加草地绘制距离MOD安装 1、在%userprofile%AppDataLocalb1SavedConfigWindows目录下找到Engine.ini文件。 2、使用记事本编辑

SimD:基于相似度距离的小目标检测标签分配

摘要 https://arxiv.org/pdf/2407.02394 由于物体尺寸有限且信息不足,小物体检测正成为计算机视觉领域最具挑战性的任务之一。标签分配策略是影响物体检测精度的关键因素。尽管已经存在一些针对小物体的有效标签分配策略,但大多数策略都集中在降低对边界框的敏感性以增加正样本数量上,并且需要设置一些固定的超参数。然而,更多的正样本并不一定会带来更好的检测结果,事实上,过多的正样本

Matlab)实现HSV非等间隔量化--相似判断:欧式距离--输出图片-

%************************************************************************** %                                 图像检索——提取颜色特征 %HSV空间颜色直方图(将RGB空间转化为HS

C/C++两点坐标求距离以及C++保留两位小数输出,秒了

目录 1. 前言 2. 正文 2.1 问题 2.2 解决办法 2.2.1 思路 2.2.2 代码实现 3. 备注 1. 前言 依旧是带来一个练手的题目,目的就一个,方法千千万,通向终点的方式有很多种,没有谁与谁,我们都是为了成为更好的自己。 2. 正文 2.1 问题 题目描述: 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。 输入格式:

mysql5.6根据经纬度查询距离二

在MySQL 5.6中,您可以使用Haversine公式来根据经纬度查询距离。以下是一个示例SQL查询,它计算出所有点与给定点(经度lon和纬度lat)的距离,并按距离排序: SELECT id, (2 * 6378.137 * ASIN(SQRT(POW( SIN( PI( ) * ( $lng- `long` ) / 360 ), 2 ) + COS( PI( ) * $lat / 180