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\),那么对于一个 ...
随机推荐
- DTSE Tech Talk丨第2期:1小时深度解读SaaS应用系统设计
摘要:介绍在SaaS场景下如何技术选型,SaaS架构设计中关键的技术点等内容. 本文分享自华为云社区<DTSE Tech Talk丨第2期:1小时深度解读SaaS应用系统设计>,作者: 华 ...
- Python 没有函数重载?如何用装饰器实现函数重载?
摘要:Python 不支持函数重载.当我们定义了多个同名的函数时,后面的函数总是会覆盖前面的函数,因此,在一个命名空间中,每个函数名仅会有一个登记项(entry). 本文分享自华为云社区<为什么 ...
- MRS HetuEgine的数据虚拟化实践
摘要:华为MRS云原生数据湖平台的HetuEngine就是一款解决大数据时代跨源跨域问题的数据虚拟化引擎. 本文分享自华为云社区<基于华为云原生数据湖MRS HetuEgine的数据虚拟化实践& ...
- linux 账号管理 添加用户与修改用户权限与密码
添加用户 useradd zhoulujun 修改用户密码 passwd zhoulujun 修改用户组 usermod -g root zhoulujun 记住这个几个就够了--
- selenium-web自动化(po模型)
什么是po模型呢?简单理解就是:把每个页面当成一个对象,给这些页面当成一个类,主要就是完成元素定位和业务操作:把它和测试脚本区分开来,需要什么取这些页面类去调用即可.这样的好处在于页面元素发生变化时, ...
- 自媒体时代的贤内助——AI 视频云
视频,通常是一段由活动画面组成的传递信息的内容.在如今这个信息爆炸的时代,我们每天都要在浩瀚的内容海洋中寻找需求的信息.一个视频是否吸引人内容固然是最重要的,但是播放是否流畅,画质是否清晰的影响力也不 ...
- AliSSR 语音超分算法:让在线会议语音更明亮更自然
超分让在线会议语音更明亮,在线会议已成为日常工作中较为普遍的沟通交流方式,接入会议的方式也呈现多样化,比如电脑入会.手机入会又或是电话入会. 雪雅.曜辰|作者 众所周知,高采样率且高带宽的音频信号富含 ...
- 一个含不少免费额度和数据下载的IP地址来源查询工具
大家好,我是TJ君! 如今在国内运营的各种互联网应用都有接入IP来源显示的要求,现在相关API的供应商也很多.今天TJ刚好看到一个不错的,所以马上给大家推荐一下. 这款不错的产品名称为:IPInfo ...
- 浏览器,navicat,IDEA--快捷键
mysql快捷键:ctrl+r 运行查询窗口的sql语句ctrl+shift+r 只运行选中的sql语句ctrl+q 打开一个新的查询窗口ctrl+w 关闭一个查询窗口ctrl+/ 注释sql语句 c ...
- VirtualBox 设置开机自动在后台启动虚拟机
打开 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 新建文件 virtualbox.bat 编写脚本 "C:\Pr ...