KD-Tree 小记🐤
KD-Tree,是用来维护一个空间(其实一般是平面)中的信息的数据结构。
以下就 2D-Tree 进行讨论。(盲猜并不会考 3D 及以上)
思想:将一个大矩形以一种方式划分成若干个小矩形,然后询问时只查询与询问矩形有交的小矩形。
每次轮流砍开 x 坐标和 y 坐标,分成左右点的个数相等的两半。
注意,这里用 nth_element 来搞,$O(n)$ 搞定。
采取以下方式来写:
int mid=(l+r)>>1; sort(lis+l,lis+1+mid,lis+1+r,o==0?cmpX,cmpY);
更新时这么写:
void build(int k,int l,int r,int o)
{
ist[k]=1; if(l==r){
lx[k]=rx[k]=lis[l];
ly[k]=ry[k]=p[lis[l]];
sum[k]=a[lis[l]];
return;
} int mid=(l+r)>>1; nth_element(lis+l,lis+mid,lis+r+1,o==0?cmpX:cmpY); build(k1,l,mid,o^1);
build(k2,mid+1,r,o^1); lx[k]=min(lx[k1],lx[k2]);
rx[k]=max(rx[k1],rx[k2]);
ly[k]=min(ly[k1],ly[k2]);
ry[k]=max(ry[k1],ry[k2]);
sum[k]=sum[k1]+sum[k2];
}
其中 cmpX,cmpY 分别是以 x 坐标和 y 坐标为关键字比较的函数。
时间复杂度 $O(n \log n)$。(但是,不占主要部分)
询问一个矩形,可以证明至多与 $O(\sqrt{n})$ 个小矩形相交(不会证),于是就 $O(q \sqrt{n})$ 了。
注意每个询问矩形被划分成 $O(\sqrt{n})$ 个区间,可以用来询问/修改。
可以考虑珂朵莉分块数组进行配套,支持 $O(1)$ 单点修改 $O(\sqrt{n})$ 区间询问。
当修改一个矩形区域时,在 KD-Tree 上自上而下进行递归,分 3 种情况:(注意与普通线段树不大一样)
1. 不相交,返回。
2. 完全被包含,递归清除所有儿子的标记,然后打上新标记,返回。
3. 部分相交,下推标记,递归处理。
cmd 证明了步骤 2 中这个递归复杂度是均摊 $O(n \log n)$ 的,没看懂(
这个递归过程如下:
1. 若有标记,则标记擦去,返回。(因为已经保证了有标记的节点子孙均没有标记)
2. 若没标记,则递归玩下去。
询问的话,看情况用线段树还是珂朵莉数组。
第一次拿到了一道黑题的最优解 (^-^)V

KD-Tree 小记🐤的更多相关文章
- AOJ DSL_2_C Range Search (kD Tree)
Range Search (kD Tree) The range search problem consists of a set of attributed records S to determi ...
- k-d tree 学习笔记
以下是一些奇怪的链接有兴趣的可以看看: https://blog.sengxian.com/algorithms/k-dimensional-tree http://zgjkt.blog.uoj.ac ...
- 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree
2648: SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2459 Solved: 834[Submit][Status][Discu ...
- K-D Tree
这篇随笔是对Wikipedia上k-d tree词条的摘录, 我认为解释得相当生动详细, 是一篇不可多得的好文. Overview A \(k\)-d tree (short for \(k\)-di ...
- K-D Tree题目泛做(CXJ第二轮)
题目1: BZOJ 2716 题目大意:给出N个二维平面上的点,M个操作,分为插入一个新点和询问到一个点最近点的Manhatan距离是多少. 算法讨论: K-D Tree 裸题,有插入操作. #inc ...
- k-d Tree in TripAdvisor
Today, TripAdvisor held a tech talk in Columbia University. The topic is about k-d Tree implemented ...
- k-d tree算法
k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 应用背景 SIFT算法中做特征点匹配的时候就会利用到k ...
- k-d tree模板练习
1. [BZOJ]1941: [Sdoi2010]Hide and Seek 题目大意:给出n个二维平面上的点,一个点的权值是它到其他点的最长距离减最短距离,距离为曼哈顿距离,求最小权值.(n< ...
- [模板] K-D Tree
K-D Tree K-D Tree可以看作二叉搜索树的高维推广, 它的第 \(k\) 层以所有点的第 \(k\) 维作为关键字对点做出划分. 为了保证划分均匀, 可以以第 \(k\) 维排名在中间的节 ...
- BZOJ3489 A simple rmq problem K-D Tree
传送门 什么可持久化树套树才不会写呢,K-D Tree大法吼啊 对于第\(i\)个数,设其前面最后的与它值相同的位置为\(pre_i\),其后面最前的与它值相同的位置为\(aft_i\),那么对于一个 ...
随机推荐
- 华为云GaussDB(for Influx)揭秘第五期:最佳实践之子查询
摘要: GaussDB(for influx)提供灵活的子查询能力,满足海量数据场景下的高性能查询需求. 本文分享自华为云社区<华为云GaussDB(for Influx)揭秘第五期:最佳实践之 ...
- Serverless,引领云计算下一个阶段
摘要:Serverless将是微服务的"封顶之作",也是推动应用现代化的基石. 本文分享自华为云社区<[深入浅出,Paas之路]华为云.云享专家曹宗南: Serverless ...
- C#开源免费的Blazor图表库
前言 今天分享一款基于ApexCharts.js封装的.C#开源免费的Blazor图表库:Blazor-ApexCharts. 10款值得推荐的Blazor UI组件库 全面的ASP.NET Core ...
- MyBatis-Plus (SpringBoot2 版)看这篇就足够了,一发入魂
1.了解 Mybatis-plus 1.1.Mybatis-Plus 介绍 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简 ...
- CodeForces - 469A I Wanna Be the Guy
There is a game called "I Wanna Be the Guy", consisting of n levels. Little X and his frie ...
- Codeforces Round #629 (Div. 3) & 19级暑假第六场训练赛
A:Codeforces 1328A Divisibility Problem 整除+模 Input 5 10 4 13 9 100 13 123 456 92 46 Output 2 5 4 333 ...
- 【调试】crash使用方法
crash简介 crash是redhat的工程师开发的,主要用来离线分析linux内核转存文件,它整合了gdb工具,功能非常强大.可以查看堆栈,dmesg日志,内核数据结构,反汇编等等. crash支 ...
- freeswitch的mod_xml_curl模块动态获取dialplan
概述 freeswitch是一款简单好用的VOIP开源软交换平台. mod_xml_curl模块支持从web服务获取xml配置,本文介绍如何动态获取dialplan配置. 环境 centos:Cent ...
- 机器学习-线性分类-支持向量机SVM-SMO算法-14
目录 1. SVM算法总结 2. SMO算法 1. SVM算法总结 选择 核函数 以及对应的 超参数 为什么要选择核函数? 升维 将线性问题不可分问题 升维后转化成 线性可分的问题 核函数 有那些? ...
- 每天学五分钟 Liunx 101 | 存储篇:LVM
LVM LVM(Logical Volume Manager),逻辑卷管理器.一种高级文件系统管理方式,它可以动态扩展文件系统. LVM 的示意图如下所示: