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\),那么对于一个 ...
随机推荐
- 震惊,PostGIS还可以这样用!!!
摘要:PostGIS为PostgreSQL提供了空间数据库分析能力,是目前业界主流的地理数据库之一,提供如下空间信息服务功能:空间对象.空间索引.空间操作函数和空间操作符等.在GaussDB 中,目前 ...
- 火山引擎A/B测试私有化实践
更多技术交流.求职机会.试用福利,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 作为一款面向 ToB 市场的产品--火山引擎 A/B 测试(DataTester)为了满足客户对数据安全 ...
- Solon Web 开发:二、开发知识准备
1.约定 //资源路径约定(不用配置:也不能配置) resources/app.yml( 或 app.properties ) #为应用配置文件 resources/WEB-INF/static/ 或 ...
- 分享个本地maven配置
用阿里云的快有点受不了了,经常有包下载不了 settings.xml <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0&q ...
- Spring解决泛型擦除的思路不错,现在它是我的了。
你好呀,我是歪歪. Spring 的事件监听机制,不知道你有没有用过,实际开发过程中用来进行代码解耦简直不要太爽. 但是我最近碰到了一个涉及到泛型的场景,常规套路下,在这个场景中使用该机制看起来会很傻 ...
- PPT 动画-树叶摆动
插入树叶 插入矩形,长宽放大1倍 树叶和矩形组合
- vue3.0 学习使用记录
vue学习 在最近的一次项目中,前端js框架里使用了vue.vue的编程思想比较新颖,用起来也感觉高效便捷.由于个人原因,做完这个项目之后可能就接触不到前端的内容了,所以记录这个项目中对vue的学习和 ...
- 极限五分钟,在宝塔中用 Docker 部署升讯威在线客服系统
我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户.对我来说,只要能获得用户的认可,就是我最大的动力. 最近客服系统成功经受住了客户现场组织的压力测试,获得了客户的认可. 客户组 ...
- Ubuntu20.04上安装MySQL8.0(绝对保证能够正常使用)
今天在学习 Spark 连接 MySQL时发现还没安装,便参考了厦门大学实验室的Blog进行操作.但安装完成之后发现没有显示设置密码的选择,但又改不掉root密码(头开始痛起来). 故记录一下安装My ...
- [kuangbin带你飞]专题十二 基础DP1 题解+总结
kuangbin带你飞:点击进入新世界 文章目录 目录 文章目录 1.Max Sum Plus Plus 2.Ignatius and the Princess IV 3.Monkey and Ban ...