首先考虑 ci∈{1,2} 的情况。
可以将一种颜色的点全部插入 K-D Tree,然后枚举另一种颜色的点,在 K-D Tree 上找和它距离最远的点。
直接 O(n) 搜显然炸裂,考虑剪枝:
通过维护子树内点每一维坐标的上下值可以得到一个最小的能覆盖整个子树的矩形,如若这个矩形的四个顶点到查询点的距离的最大值不超过当前答案,就可以退了(
以及查询左右子树时,可以启发式地选择距离更大的那边。
然而复杂度其实也是错的,但它能过(
多种颜色的,可以考虑对颜色分治。
代码:
1 |
|
首先考虑 ci∈{1,2} 的情况。
可以将一种颜色的点全部插入 K-D Tree,然后枚举另一种颜色的点,在 K-D Tree 上找和它距离最远的点。
直接 O(n) 搜显然炸裂,考虑剪枝:
通过维护子树内点每一维坐标的上下值可以得到一个最小的能覆盖整个子树的矩形,如若这个矩形的四个顶点到查询点的距离的最大值不超过当前答案,就可以退了(
以及查询左右子树时,可以启发式地选择距离更大的那边。
然而复杂度其实也是错的,但它能过(
多种颜色的,可以考虑对颜色分治。
代码:
1 | #include <cstdio> |