这一块知识点也不太好理解。。看了几个小时,大概是懂了,用于范围搜索确实可以提高不少效率
这里有个模板题:https://anoxiacxy.github.io/more/bzoj/p/2648.html
上面那个是二维的,这个算法可以搜索多维的
这里有个讲的还可以https://leileiluoluo.com/posts/kdtree-algorithm-and-implementation.html。。主要理解图,就是关于搜索范围这里可能不太好理解,在代码里面可能有点模糊
下面是上面那个模板题的模板代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 500050;
const int inf = 1e9;
inline int read(){
int x = 0,f = 1; char ch = getchar();
while(ch < '0' || ch > '9') {
if(ch == '-') f = -1; ch = getchar();}
while(ch >= '0' && ch <= '9') {
x = (x<<3) + (x<<1) + (ch^'0'); ch = getchar();}
return x * f;
}
struct node{
int d[2]; //坐标
int l,r; //每个点的左(上)区域边界点和右(下)区域边界点
int Max[2]; //这个点所维护的矩形区域
int Min[2];
}t[MAXN];
int op,x,y; //操作类型,坐标
int N,M; //初始化树的结点个数,操作次数
int root,cmpd; //kd树根,操作维度(0表示1维,1表示2维)
int ans; //最近距离
inline bool cmp(node a,node b){
if(a.d[cmpd] != b.d[cmpd])
return a.d[cmpd] < b.d[cmpd];
else
return a.d[!cmpd] < b.d[!cmpd];
}
void kd_push_up(int p){
//更新维护的区域,之所以要这样,是因为维护的是一个正方形区域,或一个圆形区域
if(t[p].l){
if(t[p].Max[0] < t[t[p].l].Max[0])
t[p].Max[0] = t[t[p].l].Max[0