双倍经验题。。。
kdtree裸题吧。。。。。今天学了下kdtree。。。感觉挺简单的。。。。
其实就是对几何图形进行剖分建树,而特殊在于,x和y轴轮流剖。。。。这样可以提供很好的性质以便于查找。。。
(一开始脑补了个treap代替kdtree。。。。。显然我脑残了。。。。写到一半发现这是不能旋转的。。。。。
(然后又脑补了下。。。。这货如果和孙子(儿子的儿子)可以旋转。。。。。。。。因为这货的节点类似红黑树。。。但是蒟蒻我太弱从来没写过红黑树。。。
很好的资料(概念脑补):
一些参考代码(虽然说完全没按照这样写):
说一下怎么查找。
首先这是曼哈顿距离。。和欧几里得距离不同。。。如果欧几里得那么简单多了。。
我们需要维护极值(即能包围所有子树包括自己的点的一个矩形的四个顶点):
如果要查找的点在矩形内,那么进入查找。
如果在矩形外,那么计算出查找点到矩形的曼哈顿距离,判断是否小于当前最优解,如果是,进入搜索。
(或许还能优化,因为一开始我的想法和这个不怎么一样。。我觉得。。递归进入两棵子树中其中一棵后(按x或y排序而不是找极值),然后判断最优解是否能从左子树的某个点越过当前根的分割线。。。。。如果是,就进入。。。
然后就没了。。。
留下的坑:欧几里得的没写过。。。删除操作没写过(觉对要斯巴达。。。。想写成平衡树(强迫症系列
#include #include #include #include #include #include #include #include #include
Description
这天,SJY显得无聊。在家自己玩。在一个棋盘上,有N个黑色棋子。他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子。此处的距离是 曼哈顿距离 即(|x1-x2|+|y1-y2|) 。现在给出N<=500000个初始棋子。和M<=500000个操作。对于每个白色棋子,输出距离这个白色棋子最近的黑色棋子的距离。同一个格子可能有多个棋子。
Input
Output
Sample Input
2 3
1 1
2 3
2 1 2
1 3 3
2 4 2
Sample Output
HINT
Source