Algorithm 计算函数和的有效算法
我们得到了形式为(x,y)的N点,我们需要计算以下函数: F(i,j)=(|X[i]-X[j]|)*(|Y[i]-Y[j]|) 计算所有有序对(i,j)的F(i,j)之和Algorithm 计算函数和的有效算法,algorithm,math,data-structures,time-complexity,Algorithm,Math,Data Structures,Time Complexity,我们得到了形式为(x,y)的N点,我们需要计算以下函数: F(i,j)=(|X[i]-X[j]|)*(|Y[i]-Y[j]|) 计算所有有序对(i,j)的F(i,j)之和 N我有一个使用O(N log(M))时间和O(M)内存的解决方案,其中M是Y范围的大小。这和你的想法很相似 首先对点进行排序,使X坐标增加 让我们为所有对写A(X[i]-X[j])*(Y[i]-Y[j]),这样Y[i]>Y[j],为所有对写i>j的相同表达式的和写B,这样Y[i]
N我有一个使用
O(N log(M))
时间和O(M)
内存的解决方案,其中M
是Y
范围的大小。这和你的想法很相似
首先对点进行排序,使X
坐标增加
让我们为所有对写A
(X[i]-X[j])*(Y[i]-Y[j]),这样Y[i]>Y[j]
,为所有对写i>j
的相同表达式的和写B
,这样Y[i]
可以在O(N)
时间内轻松计算A+B之和A+B
,并且可以从A-B
计算最终答案。因此,只需计算A
现在创建一个二元索引树,它的节点通过[a,b)
形式的整数进行索引,其中b=a+2^k
对于一些k
(不是一个好的句子,但你知道我的意思,对吧?)根节点应该覆盖Y
的可能值的整数[Y_min,Y_max]
对于由[a,b)
索引的任何节点,以及对于任何i
,让f(a,b,i)
为以下多项式:
f(a,b,i)(X,Y)=所有j的(X-X[j])*(Y-Y[j])之和,使得j
它的形式是p*XY+Q*X+R*Y+S
,因此这样的多项式可以用四个数字p,Q,R,S
表示
现在从i=0
开始,你可以计算f(a,b,i)(X[i],Y[i])
。从i
到i+1
,你只需要更新那些[a,b)
包含Y[i]
的整数。当你到达i=N
时,就会计算a
的值
如果你能负担得起
O(M)
内存,那么这应该很好。看,如果所有对导致F(i,j)的值不同,那么在O(N log N)高度没有办法做到这一点,请在评论中发布链接到竞赛。你知道i=i
的所有值都是零。你也知道对称性适用:F(i,j)=F(j,i)
@duffymo OP从来没有说过任何关于i=j是0的事情。@Dante-Typo;应该读i=i。既然x[i]-x[i]=y[i]-y[i]=0你可以链接到竞赛问题吗?你也可以压缩y坐标,得到O(N)内存和O(N log N)时间。也许,你可以对y
值进行预排序。