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

2021-10-10 15:58:09 字數 1349 閱讀 7363

題目描述

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

輸入格式

第一行:n;2≤n≤200000

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

輸出格式

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

輸入輸出樣例

輸入 #1複製

31 1

1 22 2

輸出 #1複製

1.0000

說明/提示

0<=x,y<=10^9

**

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

1001000

;const

int inf=

2<<20;

int n,temp[maxn]

;struct points[maxn]

;bool

cmp(

const point &a,

const point &b)

bool

cmps

(const

int&a,

const

int&b)

double

min(

double a,

double b)

double

dist

(int i,

int j)

double

merge

(int left,

int right)

sort

(temp,temp+k,cmps)

;for

(int i =

0; i < k; i++

)for

(int j = i +

1; j < k && s[temp[j]

].y - s[temp[i]

].y < d; j++

)return d;

}int

main()

學習自洛谷 syksykccc

merge(left,right) 是返回由編號 left和right 的點構成的最近點對的距離

temp 包含了離直線距離不超過 d 的所有點

如果離mid位置的豎線大於d則跨越豎線不可能小於d了

&& s[temp[j]].y - s[temp[i]].y < d是剪枝

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

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

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

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

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

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