本題是問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...