首页 > 其他分享 >K-D Tree

K-D Tree

时间:2024-11-11 11:22:28浏览次数:1  
标签:return int Tree mid son dep cx

K-D Tree

细节

KDT和树套树并非等价,树套树一般是时间\(O(n\log^2n)\),空间\(O(n\log n)\)的,KDT是时间\(O(n\log n+n\sqrt n)\)(修改+查询),空间\(O(n)\)

子树递归时,值域越界判断不要像线段树一样写\(L<=mid,R>mid\),而是转到儿子去写,不然会报错,因为一层只判一个维度,另一个维度可能越界,所以要两个维度都判,因此转到儿子两个维度一起判最方便(AC WA)

重构KDT时,全部树都重构和重构最高的子树一样快(亲测

代码

int n,q,ver[M],a[M],b[M],cx[M],cy[M],ntot;
bool cmp1(int x,int y) {return cx[x]<cx[y];}
bool cmp2(int x,int y) {return cy[x]<cy[y];}
struct KDT {
	int s[M],son[M][2],rtot; double alpha=0.6;
	void Pushup(int x) {s[x]=s[son[x][0]]+s[son[x][1]]+1;}
	int Build(int l,int r,int dep) {
		if(l>r) return 0;
		int mid=(l+r)>>1;
		nth_element(b+l,b+mid,b+r+1,dep&1?cmp1:cmp2);
		son[b[mid]][0]=Build(l,mid-1,dep+1);
		son[b[mid]][1]=Build(mid+1,r,dep+1);
		Pushup(b[mid]);
		return b[mid];
	}
	void GetTree(int x) {
		if(!x) return;
		b[++rtot]=x;
		GetTree(son[x][0]);
		GetTree(son[x][1]);
	}
	void Insert(int &x,int dep,int k) {
		if(!x) {x=k,s[k]=1; return;}
		Insert(son[x][dep&1?cx[k]>cx[x]:cy[k]>cy[x]],dep+1,k);
		Pushup(x);
		if(1.0*s[son[x][0]]/s[x]>alpha||1.0*s[son[x][1]]/s[x]>alpha) rtot=0,GetTree(x),x=Build(1,rtot,dep);
	}
	int Query(int x,int l1,int r1,int l2,int r2,int L1,int R1,int L2,int R2,int dep) {
		if(!x||l1>R1||r1<L1||l2>R2||r2<L2) return 0;
		if(l1>=L1&&r1<=R1&&l2>=L2&&r2<=R2) return s[x];
		int ret=0; ret+=(cx[x]>=L1&&cx[x]<=R1&&cy[x]>=L2&&cy[x]<=R2);
		if(dep&1) {
			ret+=Query(son[x][0],l1,cx[x],l2,r2,L1,R1,L2,R2,dep+1);
			ret+=Query(son[x][1],cx[x],r1,l2,r2,L1,R1,L2,R2,dep+1);
		}
		else {
			ret+=Query(son[x][0],l1,r1,l2,cy[x],L1,R1,L2,R2,dep+1);
			ret+=Query(son[x][1],l1,r1,cy[x],r2,L1,R1,L2,R2,dep+1);
		}
		return ret;
	}
}tr;

标签:return,int,Tree,mid,son,dep,cx
From: https://www.cnblogs.com/zhone-lb/p/18539330

相关文章

  • TinyVue v3.19.0 正式发布!Tree 组件终于支持虚拟滚动啦!UI 也升级啦,更更符合现代审美~
    你好,我是Kagol,个人公众号:前端开源星球。我们非常高兴地宣布,2024年10月28日,TinyVue发布了v3.19.0......
  • C语言数据结构之二叉树(BINARY TREE)的多种数据类型存贮
    C语言数据结构之二叉树(BINARYTREE)的多种数据类型存贮用无类型指针(void*)来做为基本数据类型来存贮数据,将其他数据类型强制转化为无类型指针,从而达到目标!!!输出函数指针BTFunc比较函数指针BTCmpFunc返回值为整型值1、-1、0,表示大于、小于、相等代码如下:/*filename:btr......
  • TreeUtil
    点击查看代码importorg.apache.commons.collections4.CollectionUtils;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.CopyOnWriteArrayList;importjava.util.concurrent.atomic.AtomicInteger;importjava.util.function.BiConsume......
  • [USACO23JAN] Subtree Activation P 题解
    这种问题一看满足条件就知道,一般不用想着怎么模拟题意。考虑转化问题。假如节点\(u\)满足了条件一,也就是仅有子树节点全部开启。那么我们把转化具象为:进行\(\text{siz}_u\)次操作直接清空;进行\(\text{siz}_{\text{fa}(u)}-\text{siz}_u\)次操作使\(\text{fa}(u)\)满足......
  • c++ Kruskal 最小生成树 (MST) 算法(Kruskal’s Minimum Spanning Tree (MST) Algorith
            对于加权、连通、无向图,最小生成树(MST)或最小权重生成树是权重小于或等于其他所有生成树权重的生成树。Kruskal算法简介:        在这里,我们将讨论Kruskal算法来查找给定加权图的MST。         在Kruskal算法中,按升序对给定图的所有......
  • JavaScript Kruskal 最小生成树 (MST) 算法(Kruskal’s Minimum Spanning Tree (MST) A
             对于加权、连通、无向图,最小生成树(MST)或最小权重生成树是权重小于或等于其他所有生成树权重的生成树。Kruskal算法简介:        在这里,我们将讨论Kruskal算法来查找给定加权图的MST。         在Kruskal算法中,按升序对给定图的所......
  • 线段树(Segment Tree)详解
    写在前面:此博客内容已经同步到我的博客网站,如需要获得更优的阅读体验请前往https://blog.mainjay.cloudns.ch/blog/algorithm/segment-tree1.为什么需要线段树?1.1问题起源想象这样一个场景:有一个长度为n的数组,我们需要经常进行以下操作:查询数组中某个区间[l,r]的......
  • ARM-8 代码还原动态调试 pstree 之 out_char
    voidout_char(charc){/*403370: b00001c1 adrp x1,43c000<memcpy@GLIBC_2.17>403374: 9121c021 add x1,x1,#0x870//x1=0x43c870403378: 12001c00 and w0,w0,#0xff//w0=c&0xff40337c: b9401022 ldr w2,[x1,#16]//w2=[0x43c880......
  • Tree
    P4178Tree题目描述:给定一棵n个节点的树,每条边有边权,求出树上两点距离小于等于k的点对数量。数据范围:\(1≤n≤4×10^4\)\(1≤k≤2×10^4\)说句闲话感谢著名CB大师red_fire倾情推荐%%%在机房三个人唇枪舌剑了一小会,我们的CB大师直接开搞线段树,而仔细研读了数据范围的本......
  • 转 数据结构LMS-TREE 解析
    ##sample1LMS-TREE用于oceanbase数据库的内核,与传统数据库存在很多不一致的地方包括写多份数据,支持快速写,对读支持不如传统数据库,因为特意转载如下文章https://blog.51cto.com/u_15127649/3727804 平衡二叉树、B树、B+树、B*树、LSM树简介 转载mob604756fec84d2018......