存個模板:
是用分治寫的時間複雜度 nlogn
但是本題好像還有一種玄學做題法:
我們充分發揚人類智慧型:
將所有點全部繞原點旋轉同乙個角度,然後按x座標排序
根據數學直覺,在隨機旋轉後,答案中的兩個點在陣列中肯定不會離得太遠
所以我們只取每個點向後的5個點來計算答案
這樣速度快得飛起,在n=1000000時都可以在1s內卡過。。。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define llu unsigned ll
using
namespace std;
const
int maxn=
200100
;const
double eps=
1e-8
;const
double dnf=
1e20
;struct point};
double
dis(point a,point b)
point p[maxn]
;point temp[maxn]
;bool
cmpx
(const point &a,
const point &b)
bool
cmpy
(const point &a,
const point &b)
double
closest_pair
(int l,
int r)
sort
(temp,temp+cnt,cmpy)
;for
(int i=
0;i)for
(int j=i+
1;j.y-temp[i]
.y) d=
min(d,
dis(temp[i]
,temp[j]))
;return d;
}int
main
(void
)
平面最近點對
求點集中的最近點對有以下兩種方法 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。1 蠻力法 適用於點的數目比較小的情況下 1 演算法描述 已知集合s中有n個點,一共可以組成n n 1 2對點對,蠻力法就是對這n n 1 2 ...
平面最近點對
求點集中的最近點對有以下兩種方法 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。1 蠻力法 適用於點的數目比較小的情況下 1 演算法描述 已知集合s中有n個點,一共可以組成n n 1 2對點對,蠻力法就是對這n n 1 2對...
平面最近點對
求點集中的最近點對有以下兩種方法 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。1 蠻力法 適用於點的數目比較小的情況下 1 演算法描述 已知集合s中有n個點,一共可以組成n n 1 2對點對,蠻力法就是對這n n 1 2對...