給你二維平面上的n個點,讓你求出其中最近的點對。
【題解】
這是乙個分治的問題。
可以這樣做:
首先將n個點按照x公升序排。
然後將l..r這個區間內的點分成
l..mid和mid+1..r兩個部分遞迴求解。
分別求出這兩段裡面的點的最近點對的距離d1和d2
然後令d = min(d1,d2)
這是最後答案的點都在其中一邊的情況。
現在考慮最後答案的點對分別在左區間p1和右區間p2的情況。
首先可以將左區間和右區間中點的橫座標和分割線距離超過d的點去掉。
然後對於每乙個p1,在其右側畫乙個長d,高2d的矩形。
就會發現那個矩形內最多隻會有6個右區間中的點(鴿巢原理)
所以我們只需要將l..r這個區間內的點按照y軸公升序排一下序就好。
然後對於每個點(x,y)檢查y座標的範圍在(y-d,y+d)的其他點就好.
但這樣排序的話,時間複雜度是n*logn*logn級別的。
我們可以在進行答案的合併的時候,順便對每個子區間做一下歸併排序(按照y軸).
然後歸併排序的時候,對於左區間的點,順便遍歷和它的y座標差的絕對值小於d的其他點即可
這樣時間複雜就是n*logn級別的了
【**】
#include #include using namespace std;
const int n = 1e5;
const int oo = 1e9;
struct abc;
int n;
abc a[n+10];
abc b[n+10];
int sqr(int x)
int dis(abc a,abc b)
int min(int x,int y)
for (int l = j;l<=r;l++)
}if (i<=mid) b[k++] = a[i++];
}for (int i = l;i<= r;i++) a[i] = b[i];
return d;
}void _swap(abc *x,abc *y)
void kp(abc a,int l,int r)
a[l] = a[j];
a[j] = temp;
if (lif (j}int main()
AOJ 862 平面上最近點對
time limit 1000 ms memory limit 256 mb total submission 78 submission accepted 8 judge by case description 給定平面上n個點,找出其中的一對點的距離,使得這n個點的所有點對中,該距離為所有點對中...
平面最近點對問題
平面最近點對問題正如其名,給定平面上的 n 個點,找出其中的一對點,使得這對點的距離在所有點對中最小。首先顯而易見地我們可以得到這個問題的 o n 2 演算法,列舉所有點對即可。但是很顯然我們可以注意到,這裡面有很多點對顯然不是最優的,那麼我們可以想到一種剪枝方法,就是將只對x座標差值小於當前已知最...
平面最近點對問題詳解
演算法 0 把所有的點按照橫座標排序 1 用一條豎直的線l將所有的點分成兩等份 2 遞迴算出左半部分的最近兩點距離d1,右半部分的最近兩點距離d2,取d min d1,d2 3 算出 乙個在左半部分,另乙個在右半部分 這樣的點對的最短距離d3。4 結果 min d1,d2,d3 關鍵就是這第3步。貌...