K-D Tree 总结
前置芝士
例题略解
P2479 [SDOI2010]捉迷藏
大概就是 K-D Tree 的板子题了吧,网上的打法都不太友好,参考了 fengwu 的打法。
对于建树的时候每一层针对不同的维度来建,保证相邻的层不是根据一个维度建。
取 min 和取 max 的操作不太一样,因为最小值并不一定是两端,也可能是序列中间的部分。
有一个优化就是关于枚举顺序,优先挑更可能是答案的来进行计算。
每一次计算的结果同时对于与现在扫到的点最优解的点的值也进行更新,算是一个优化吧
P4475 巧克力王国
还是维护两个坐标的最大以及最小值。
因为是一次函数,所以只要考虑最大值以及最小值就可以知道这个区间是否可以。
在维护最大最小值的同时维护一个区间的美味值加和。
对于每一个询问扫一遍查询一遍就好了。
P2093 [国家集训队]JZPFAR
还是老套路,维护最大最小值。
同时加上一个优先队列维护当前扫到的前 k 大的数字。
遇到更优的就替换掉。
P4357 [CQOI2016]K 远点对
和上一个题的套路一模一样。
只不过没有了询问,直接再次扫一边整个序列进行求解就好了。
注意每一个点对会被扫到两边,需要把给的 K 乘上一个 2。
P4169 [Violet]天使玩偶/SJY摆棋子
其实如果没有插入操作的话就是一个板子。。。
对于插入操作如果我们只是暴力插入极有可能会导致整棵树的不平衡。
因此我们借鉴一下替罪羊树的思路:
如果某一棵子树所占比大于某一个值,就利用一个 \(\alpha\) 值对于整棵树进行重建,以保证整棵树的平衡。
于是我们愉快的用 \(pia\) 操作+\(O_2\) 通过了此题。
P4848 崂山白花蛇草水
用暴力水过去的,但是快就行了。
开两个数组,一个大的,一个小的,并且保证是有序的。
每一次的插入操作直接插入到小的数组的对应位置。
如果插入后小块的大小 \(\ge \sqrt{n}\) 的话就把小块中的全部归并到大的数组中。
这样做可以大大的减小插入的复杂度。
然后查询的话,直接暴力查找就好了。