平面幾何最近兩點(分治 sort)

2021-10-06 07:52:26 字數 1964 閱讀 8136

本題是問station和agent之間最近的兩個,不妨先想想如果是x-y平面內最近的兩點怎麼算呢。

先按x座標公升序排,(如果x相同,那麼y小的排到前面)

之後就開始分治了**divide(l,r)【l,r】**區間內的最近點對。

問題可以再縮小,考慮d1= 【l,mid】內的最近點對

d2=【mid+1,r】內的最近點對由於只考慮了上面左右區間最接近的點對,是不嚴謹的·。

因為最近點對,可能是乙個在【l,mid】,而另乙個在【mid+1,r】。

所以要列舉找到【l,r】內滿足條件的點對,之後暴力求d3.(這裡要智慧型暴力)

返回就是min(d1,d2,d3);

其實就把station和agent標號,當兩者的標號相異,就算距離,否則就返回inf

double 的有效位15-16,數值範圍可以到1e308這次又沒開longlong見了一回祖宗。qwq。

#include

#include

#include

#include

#include

#include

#define for(i,x,y) for(register int i=(x); i<=(y); i++)

#define mst(x,a) memset(x,a,sizeof(x))

using

namespace std;

typedef

long

long ll;

const

int maxn=

2e5+10;

const

double inf=

1e30

;struct point

p[maxn]

;vectorv;

bool

cmpx

(point a, point b)

bool

cmpy

(point a, point b)

double

dis(point a, point b)

double

divd

(int l,

int r)

int mid=l+

(r-l)/2

;double d1=

divd

(l,mid)

;double d2=

divd

(mid+

1,r)

;double d=

min(d1,d2)

;for

(i,l,r)

sort

(v.begin()

,v.end()

,cmpy)

;int len=v.

size()

;for

(i,1

,len)}}

v.clear()

;return d;

}int

main()

for(i,n+1,

2*n)

scanf

("%lld%lld"

,&p[i]

.x,&p[i]

.y);

sort

(p+1

,p+1+2

*n,cmpx)

;printf

("%.3f\n"

,divd(1

,2*n));}

return0;

}

平面中最近的兩點(分治法)

設平面上的點按x排序好了,這樣最多增加o n logn 這再整個演算法來看並沒有增加複雜度級別。排好序後,可以劃一條垂線,把點集分成兩半 pl和pr。於是最近點對或者在pl中,或者在pr中,或者pl,pr各有一點。把三種距離情況定義為dl,dr,dc.其中dl,dr可以遞迴求解,於是問題就變為計算d...

關於平面最近兩點問題

最簡單的思想是直接進行遍歷,也就是n n 1 的複雜度 如果採用分治的思想會簡單很多 看了好幾篇blog,發現都不怎麼講人話,其實本質上是通過一維分治推出來的 對於一維數軸下找最近兩點,可以按照座標點進行分治 直接遞迴二分區域,使得細分為左右各有乙個點或者兩個點的區域 但是有可能發生以上的情況 左半...

分治法求解平面n點中距離最近的兩點

最近點對問題定義 已知上m個點的集合,找出對接近的一對點。在二維空間裡,可用分治法求解最近點對問題。預處理 分別根據點的x軸和y軸座標進行排序,得到x和y,很顯然此時x和y中的點就是s中的點。情況 1 點數小於等於三時 情況 2 點數大於三時 首先劃分集合s為sl和sr,使得sl中的每乙個點位於sr...