KDT

不适合一天打五个小时模拟赛,打完就没脑子了,感觉看一晚上 b 站才能把脑子找回来。

只能看点没脑子的数据结构了。

用于维护 \(k\) 维空间上的信息。是 BST 的结构。每个节点上都是 \(k\) 维空间中的一个点,每棵子树处于一个 \(k\) 维超长方体中。

建树

动态记录当前所维护的 \(k\) 维超长方体,设有 \(n\) 个点在该超长方体中,则需要选择一点和一个维度,将该点的该维度作为分界线递归建树。

为了保证树高和复杂度,从上到下轮流选取 \(k\) 个维度,并且选择该维度上位于中位数的那个点。

现在的建树瓶颈在于从一堆数中找出中位数,更一般地考虑从一堆数中找出排名第 \(k\) 大的数:

每次随机选择一个数,将比这个数小的放在左边,大的放在右边,递归合法的那一边,这样的期望时间复杂度为 \(O(n)\)

还有一个东西叫做 nth_element(s+l,s+mid,s+r+1,cmp)

建树复杂度为 \(O(n\log n)\)

查询

查询时按照平衡树的查询方式即可。

可以证明,时间复杂度为 \(O(n^{1-\dfrac{1}{k}})\)

插入

维护 \(\log\) 棵 KDT,其中每棵的大小为 \(2\) 的幂,插入时新增一棵 KDT。然后不断合并大小相同的 KDT,直接重构即可。均摊复杂度 \(O(n\log^2 n)\)

删除

根号重构。

随机化方面的应用

随机化做平面 \(k\) 近点对。看 oi-wiki 吧,脑子不够用了

posted @ 2024-10-15 19:22  BYR_KKK  阅读(22)  评论(0编辑  收藏  举报