P1429 平面最近點對(加強版) 分治

2021-10-08 18:26:24 字數 1204 閱讀 9022

平面上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

log⁡n)

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個點...