定义1:当且仅当x <0时,点(x,y)是控制点(x',y')。 x'和y&lt; Y”。
定义2:点(x,y)由点(x',y')控制当且仅当x'&lt; x和y'&lt;收率
我正在尝试提供数据结构以支持以下操作:
Add(x,y) - 以O(logn)复杂度向系统添加点(x,y),其中n是系统中的点数。
删除(x,y) - 以O(logn)复杂度从系统中移除一个点(x,y),其中n是系统中的点数。
分数(x,y) - 返回点数(x,y)控制数 - (x,y)控制的点数。最坏情况复杂度O(logn)。
我尝试使用多个AVL树解决它,但无法提供足够优雅的解决方案。
答案 0 :(得分:2)
当且仅当x <0时,点(x,y)是控制点(x&#39;,y&#39;)。 X&#39;和y&lt; ý&#39;
点(x,y)由点(x&#39;,y&#39;)控制,当且仅当x&#39; &LT; x和 ý&#39; &LT;收率
让我们假设(x,y)是正方形的中间。 (x,y)是B平方中的控制点,由C中的点控制。
所需的输出是点数(x,y)控制减去由(x,y)控制的点数(x,y)。这是B中的点数减去C中的点数B-C
(参考A,B,C,D中的点数仅为A,B,C,D
)。
我们可以轻松计算A+C
中的点数,这只是x&#39;的点数。 &LT; X。
同样适用于C+D
(带有y&#39; y的点),B+D
(x&#39;&gt; x)。
我们将A+C
加到C+D
A+2C+D
。
将A+B
加到B+D
A+2B+D
。
扣除两个:A+2B+D-(A+2C+D) = 2B-2C
,除以2:(2B-2C)/2 = B-C
这是所需的输出。
(我假设处理1D案件很简单,没有必要解释。)
答案 1 :(得分:1)
为了将来参考
解决方案大纲:
我们将维护两个AVL树。
两棵树中的每个节点都将包含以下附加数据:
对于点$(x,y)$,我们将定义区域A,B,C,D:
现在很明显得分(x,y)= | C | - | B |。 但是| A | + | C |,| B | + | D |,| A | + | B |,| C | + | D |可以很容易地从我们的两个AVL树中检索到,我们很快就会看到。 请注意[(| A | + | C | + | C | + | D |) - (| A | + | B | + | B | + | D |)] / 2 = | C | - | B |
实施所需的操作:
添加(x,y) - 我们将向两个AVL树添加点(x,y)。由于我们存储的附加数据仅在插入路径上受影响,并且由于插入发生在(logn)中,因此Add(x,y)的总成本为O(logn)。
删除(x,y) - 我们将从两个AVL树中删除点(x,y)。由于我们存储的附加数据仅在删除路径上受到影响,并且由于删除发生在(logn)中,因此Remove(x,y)的总成本为O(logn)。
得分(x,y) - 我将展示如何以类似的方式和相同的复杂性成本计算$ | B | + | D | $。很明显,$ | B | + | D | $是满足$ x&#39;的点数。 &GT; X $。要计算这个数字,我们将:
Remove(x,y)的总成本为O(logn)。