平面上n
nn個點,求最近點對
考慮分治求最近點對,首先將平行於y
yy軸將平面穿過x
xx左邊的中位數分割成兩半,現在最近點對有三種可能,
在分割線左邊
在分割線右邊
穿過分割線
我們知道1和2可以用分治到兩邊計算,考慮如何求情況3。暴力列舉對數肯定會tle
tletl
e,考慮優化,假設我們已經知道1和2的最小解d1,
d2
d1,d2
d1,d
2了,我們有d=m
in
d=min\
d=mi
n,那麼我們可以以分割線為對稱軸做乙個2d∗
d2d*d
2d∗d
的矩形,最近點對的兩個點一定在這個矩形內。
這樣計算為什麼可以優化演算法?因為矩陣內的點數是常數級別的,首先我們可以由分割線分割成兩個小正方形,我們知道正方形內的點距離一定不小於d
dd,那麼乙個正方形內最多只有常數級別的點數(好像是3個的樣子)
所以時間複雜度o(n
logn)
o(n\log n)
o(nlogn)
#include
#include
#include
#include
using
namespace std;
const
int n=
2e5+10;
int n,p[n]
,c[n]
;double x[n]
,y[n]
;bool
cmp(
int a,
int b)
bool
cmp(
int a,
int b)
double
get_dis
(int a,
int b)
double
solve
(int l,
int r)
}return d;
}int
main()
sort
(p+1
,p+1
+n,cmp)
;printf
("%.4lf"
,solve(1
,n))
;}
P1429 平面最近點對(加強版)
題目描述 給定平面上n個點,找出其中的一對點的距離,使得在這n個點的所有點對中,該距離為所有點對中最小的 輸入格式 第一行 n 2 n 200000 接下來n行 每行兩個實數 x y,表示乙個點的行座標和列座標,中間用乙個空格隔開。輸出格式 僅一行,乙個實數,表示最短距離,精確到小數點後面4位。輸入...
P1429 平面最近點對(加強版)
給定平面上n個點,找出其中的一對點的距離,使得在這n個點的所有點對中,該距離為所有點對中最小的 輸入格式 第一行 n 2 n 200000 接下來n行 每行兩個實數 x y,表示乙個點的行座標和列座標,中間用乙個空格隔開。輸出格式 僅一行,乙個實數,表示最短距離,精確到小數點後面4位。輸入樣例 1 ...
P1429 平面最近點對(加強版)(分治)
p1429 平面最近點對 加強版 主要思路 分治,將點按橫座標為第1關鍵字公升序排列,縱座標為第2關鍵字公升序排列,進入左半邊和右半邊進行分治。設d為左右半邊的最小點對值。然後以mid這個點為中心,擴充套件寬為2d,長為2d的正方形。除了這個正方形外的點都不可能使答案更小。而且這個正方形裡至多8個點...