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

2022-05-09 18:22:23 字數 1067 閱讀 5454

給定平面上n個點,找出其中的一對點的距離,使得在這n個點的所有點對中,該距離為所有點對中最小的

輸入格式:

第一行:n;2≤n≤200000

接下來n行:每行兩個實數:x y,表示乙個點的行座標和列座標,中間用乙個空格隔開。

輸出格式:

僅一行,乙個實數,表示最短距離,精確到小數點後面4位。

輸入樣例#1:

3

1 11 2

2 2

輸出樣例#1:

1.0000

0<=x,y<=10^9

實在想不明白這題跟計算幾何有什麼關係,,

不過也算是一道好題,

✔將各個點(結構體)按x的從小到大排序

✔首先運用二分思想將點集合分到最後只剩兩個點的時候

✔然後用這兩點之間的距離更新答案(答案初始化為無限大)

✔然後我們要找到二分的具體實現方案——每次分到一些點時,找到這些點標號的中間(因為點都排好序了,所以其實也就是找到x軸上一條分界線),將整個點的集合大致均分為兩個部分

✔在分界線的右側,將與分界線的距離小於ans的點納入到乙個輔助結構體裡面

✔在分界線的左側,不斷列舉點,列舉到離分界線小於ans的點時,與輔助結構體中的點挨個(等會有解釋)判斷其距離有沒有小於ans,更新ans

1 #include2 #include3 #include4 #include5

using

namespace

std;

6const

int maxn=200001

;7 inline void read(int &n)813

struct

point

14point[maxn],a[maxn];

17int comp(const point &a,const point &b)

18 19

double ans=43843843800.0;20

void work(int l,int

r)21

34int

main()

35

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

題目描述 給定平面上n個點,找出其中的一對點的距離,使得在這n個點的所有點對中,該距離為所有點對中最小的 輸入格式 第一行 n 2 n 200000 接下來n行 每行兩個實數 x y,表示乙個點的行座標和列座標,中間用乙個空格隔開。輸出格式 僅一行,乙個實數,表示最短距離,精確到小數點後面4位。輸入...

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

平面上n nn個點,求最近點對 考慮分治求最近點對,首先將平行於y yy軸將平面穿過x xx左邊的中位數分割成兩半,現在最近點對有三種可能,在分割線左邊 在分割線右邊 穿過分割線 我們知道1和2可以用分治到兩邊計算,考慮如何求情況3。暴力列舉對數肯定會tle tletl e,考慮優化,假設我們已經知...

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

p1429 平面最近點對 加強版 主要思路 分治,將點按橫座標為第1關鍵字公升序排列,縱座標為第2關鍵字公升序排列,進入左半邊和右半邊進行分治。設d為左右半邊的最小點對值。然後以mid這個點為中心,擴充套件寬為2d,長為2d的正方形。除了這個正方形外的點都不可能使答案更小。而且這個正方形裡至多8個點...