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 小记🐤的更多相关文章

  1. 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 ...

  2. k-d tree 学习笔记

    以下是一些奇怪的链接有兴趣的可以看看: https://blog.sengxian.com/algorithms/k-dimensional-tree http://zgjkt.blog.uoj.ac ...

  3. 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree

    2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2459  Solved: 834[Submit][Status][Discu ...

  4. K-D Tree

    这篇随笔是对Wikipedia上k-d tree词条的摘录, 我认为解释得相当生动详细, 是一篇不可多得的好文. Overview A \(k\)-d tree (short for \(k\)-di ...

  5. K-D Tree题目泛做(CXJ第二轮)

    题目1: BZOJ 2716 题目大意:给出N个二维平面上的点,M个操作,分为插入一个新点和询问到一个点最近点的Manhatan距离是多少. 算法讨论: K-D Tree 裸题,有插入操作. #inc ...

  6. k-d Tree in TripAdvisor

    Today, TripAdvisor held a tech talk in Columbia University. The topic is about k-d Tree implemented ...

  7. k-d tree算法

    k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 应用背景 SIFT算法中做特征点匹配的时候就会利用到k ...

  8. k-d tree模板练习

    1. [BZOJ]1941: [Sdoi2010]Hide and Seek 题目大意:给出n个二维平面上的点,一个点的权值是它到其他点的最长距离减最短距离,距离为曼哈顿距离,求最小权值.(n< ...

  9. [模板] K-D Tree

    K-D Tree K-D Tree可以看作二叉搜索树的高维推广, 它的第 \(k\) 层以所有点的第 \(k\) 维作为关键字对点做出划分. 为了保证划分均匀, 可以以第 \(k\) 维排名在中间的节 ...

  10. BZOJ3489 A simple rmq problem K-D Tree

    传送门 什么可持久化树套树才不会写呢,K-D Tree大法吼啊 对于第\(i\)个数,设其前面最后的与它值相同的位置为\(pre_i\),其后面最前的与它值相同的位置为\(aft_i\),那么对于一个 ...

随机推荐

  1. 5种Python使用定时调度任务的方式

    摘要:Python 有几种方法可以定时调度一个任务,这就是我们将在本文中学习的内容. 本文分享自华为云社区<Python中使用定时调度任务(Schedule Jobs)的5种方式)>,作者 ...

  2. iOS 应用上架的步骤和工具简介

    编辑 APP开发助手是一款能够辅助iOS APP上架到App Store的工具,它解决了iOS APP上架流程繁琐且耗时的问题,帮助跨平台APP开发者顺利将应用上架到苹果应用商店.最重要的是,即使没有 ...

  3. Google 发布:DevOps 2022现状报告

    在过去的八年中,全球超过 33,000 名专业人士参与了Accelerate State of DevOps 调查,使其成为同类研究中规模最大.运行时间最长的一项.Accelerate State o ...

  4. Grafana--变量(label_values)

    grafana官方文档:https://grafana.com/docs/grafana/latest/ 版本:6.5.2 模板与变量(摘抄自官方文档): 变量是值的占位符.您可以在度量查询和面板标题 ...

  5. AliAGC 自动增益控制算法:解决复杂场景下的音量问题

    音视频会议,直播连麦以及短视频已经成为人们工作.教学以及娱乐的一部分,其背后都离不开音视频实时通信等关键技术的广泛应用.音频方面,可预见的是客户业务形式的多样性,环境的复杂性,以及接入设备的差异性会带 ...

  6. docker centos 容器时间与宿主机时间不一致

    上图 容器时间不一致会造成N多问题,估计各位看官儿应该深有体会. 我处理的方式是在,dockerfile 中进行增加一条命令进行设置: RUN cp /usr/share/zoneinfo/Asia/ ...

  7. HTML+CSS小实战案例 (照片墙特效、代码展示)

    预览图: HMTL代码部分 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  8. 前端科普系列(2):Node.js 换个角度看世界

    本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/fPNMaeNYgU3eJsh0SLMRRg作者:孔垂亮 [前端科普系列]往期精彩内容: &l ...

  9. 【RK3399】2.制作ubuntu20.04 roomfs

    firefly自带的文件系统,由于缺少一些基本功能模块,因此,我们可以自己手动制作一个ubuntu20.04的文件系统. 下载Ubuntu根文件系统 http://cdimage.ubuntu.com ...

  10. JVM 内存模型及特点总结

    本文为博主原创,未经允许不得转载: JVM 内存区域主要分为线程私有区域[程序计数器.虚拟机栈.本地方法区].线程共享区域[JAVA 堆.方法区].直接内存. 线程私有数据区域生命周期与线程相同, 依 ...