題目描述
給定平面上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個點...