書上講解 平面上最近點對問題

2022-05-20 19:59:28 字數 1183 閱讀 5751

給你二維平面上的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步。貌...