计算2个圆圈内的总点数

时间:2013-03-05 09:10:44

标签: algorithm data-structures

有2个圆圈,它们的中心是固定的,将作为输入给出。然后会有n个点,其x和y坐标作为输入。

最后,会有q个查询。对于每个查询,将给出两个圆的半径(让它们为r1和r2)。输出每个查询的第一个圆圈或第二个圆圈内的总点数。如果从点到中心的距离小于或等于圆的半径,则点位于圆内。

约束:n,q <= 10 ^ 6 r1,r2 <= 10 ^ 7并且对于每个坐标,| x |和| y | &lt; = 10 ^ 6

我正在寻找O(nlogn)或O(nlog ^ 2n)预处理,然后每个查询找到O(logn)算法。 每个查询的O(n)解决方案太慢了。任何想法如何破解这个?

2 个答案:

答案 0 :(得分:4)

O(log 2 N)查询时间的解决方案。

  1. 每个查询更容易计算两个圆圈之外的点数,然后从总点数中减去结果。
  2. 使用笛卡尔坐标更容易。因此,X将是距离C1的距离,Y - 距离C2的距离。在这种情况下,我们只需要找到区域X > r1 && Y > r2中的点数。
  3. 为每个点指定值“1”。现在我们只需要找到给定区域中的值的总和。在1D情况下,这可以用Fenwick树完成。但如果使用2D Fenwick树,则2D情况并没有太大差异。
  4. 2D Fenwick树应占用太多空间(10 12 值,给定约束)。但Fenwick树的2D数组非常稀疏,因此我们可以使用哈希映射来存储其值并将空间要求(和预处理时间)减少到O(N log 2 N)。

答案 1 :(得分:2)

让C1,C2成为磁盘的中心。设Pi,i = 1 ... n为点。设Qj,j = 1 ... q,为第j个查询,Qj =(qj1,qj2)。

  1. 对于每个点Pi,计算d(Pi,Ck),k = 1或2.将其放入有序多图中:Mk(d(Pi,Ck))包含Pi。这可以在O(nlogn)中完成(这实际上就像排序距离列表一样)。
  2. 对于每个查询Qj,在Mk的键上进行qjk的二进制搜索,可以在O(logn)中完成。
  3. 对于每个查询Qj,取多于或等于上面找到的键的多重映射值的并集。