【luogu 1429】平面最近点对 K-D Tree

本文介绍了如何利用K-D Tree解决平面最近点对问题,重点在于理解K-D Tree在高维空间中的应用,及其在切割维度上的作用。
摘要由CSDN通过智能技术生成

KD树用来维护高维空间状态信息。非叶子结点都是记录在那个维度上的切割。

K-D Tree模板题,记录一下。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 200000 + 7;
const double INF = 2e18;
double ans = INF;
int n;  // 结点个数
int d[maxn]; // 每个结点所在的维度
int lc[maxn]; // 结点的左子结点
int rc[maxn]; // 结点的右子结点
struct node {
	double x; // 横坐标
	double y;  // 纵坐标
}s[maxn]; // 结点
double L[maxn]; // 左区间
double R[maxn]; // 右区间
double U[maxn]; // 上区间
double D[maxn]; // 下区间
double dist(int a, int b)  // 求出两个点的欧几里得距离
{
	return (s[a].x - s[b].x) * (s[a].x - s[b].x) + (s[a].y - s[b].y) * (s[a].y - s[b].y);
}
bool cmp1 (node a, node b)  // 在 x 维度上排序
{
	return a.x < b.x;
}
bool cmp2 (node a, node b)  // 在 y 维度上排序
{
	return a.y < b.y;
}
void maintain(int x) // 维护结点信息
{
	L[x] = R[x] = s[x].x;  // 每个矩形的左右开始为自己的横坐标
	D[x] = U[x] = s[x].y;  // 每个矩形的上下开始为自己的纵坐标
	if(lc[x]) {  /
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值