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 吧,脑子不够用了