KDTree模板

这一块知识点也不太好理解。。看了几个小时,大概是懂了,用于范围搜索确实可以提高不少效率

这里有个模板题: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值