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]) { /