【题目大意】
定义点与点之间的距离为max(|Xi-Xj|,|Yi-Yj|)
给定N个点,将这N个点中每个点与最近点的距离加起来,输出SUM。
【算法分析】
算法1:
算了下复杂度O(N^2)的话加些优化应该可以卡过。
于是我把他们按x排序,x相等的按y排序。
然后枚举当前点i,并向前和向后枚举点j,如果出现abs(X[j]-X[i])>=now (其它now为当前答案),那么可以break退出循环。(最优化剪枝)
然后这样就可以9000MS左右AC了。
算法2:
同算法1那样排序。
再按X坐标离散化。
然后枚举当前点i,并二分答案(当前最短距离)。
问题转化为看是否存在点(X[j],Y[j]),使得abs(X[j]-X[i])<=ANS 且 abs(Y[j]-Y[i])<=ANS
于是就可以以X轴为线段树所划分的区间建立一棵线段树,线段树上再建立一棵以Y坐标为key值的平衡树。
然后在上面进行查找。每次查找的复杂度是O((lgN)^2)。
加上二分答案,每个点的处理复杂度为O((lgN)^3)。
所以总时间复杂度为O(N (lgN)^3 )。
空间复杂度为O(NlgN)。
因为最同一深度的线段树区间下,一个点只能出现在一个区间内。所以一个点最多出现lgN次。所以空间复杂度不是问题。
但是这个算法编程复杂度可能比较高。如果用STL的
晕 还真可以这样水过啊.
回复IT_intheway:大牛你不是水过的?膜拜吖。。。
表示被吓死了…
汗 我是小菜, 这题想水但是没敲.
回复卡通BlueEye:这个。。。确实解法2有点吓人?我是不敢在不会STL的情况下敲了。。。
不是显然可以做到O(log N) per operation么……
回复ftiasch:这是在和你讨论之前写的。。。我弱。。。大神不要BS吖= =
求解怎么做到O(log N) per operation的。。。。