給定平面上n個點,找出其中的一對點的距離,使得在這n個點的所有點對中,該距離為所有點對中最小的
輸入格式:
第一行:n;2≤n≤200000
接下來n行:每行兩個實數:x y,表示乙個點的行座標和列座標,中間用乙個空格隔開。
輸出格式:
僅一行,乙個實數,表示最短距離,精確到小數點後面4位。
輸入樣例#1:
31 11 2
2 2
輸出樣例#1:
1.0000
0<=x,y<=10^9
實在想不明白這題跟計算幾何有什麼關係,,
不過也算是一道好題,
✔將各個點(結構體)按x的從小到大排序
✔首先運用二分思想將點集合分到最後只剩兩個點的時候
✔然後用這兩點之間的距離更新答案(答案初始化為無限大)
✔然後我們要找到二分的具體實現方案——每次分到一些點時,找到這些點標號的中間(因為點都排好序了,所以其實也就是找到x軸上一條分界線),將整個點的集合大致均分為兩個部分
✔在分界線的右側,將與分界線的距離小於ans的點納入到乙個輔助結構體裡面
✔在分界線的左側,不斷列舉點,列舉到離分界線小於ans的點時,與輔助結構體中的點挨個(等會有解釋)判斷其距離有沒有小於ans,更新ans
1 #include2 #include3 #include4 #include5using
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個點...