計算幾何 最近點對入門

2021-10-10 13:28:26 字數 4359 閱讀 1548

解題思路

算最近點對距離的一半即可。

參考**

#include

using

namespace std;

#define local

//提交的時候一定注釋

#define _for(i, a, b) for(int i = (a); i < (b); ++i)

#define _rep(i, a, b) for(int i = (a); i <= (b); ++i)

#define pb push_back

#define vi vector

#define inf 1e20

#define mp make_pair

#define lowbit(x) ((x) & (-x))

typedef

long

long ll;

typedef

double db;

const db eps =

1e-8

;//定義浮點數誤差

const

int mod =

998244353

;const

int maxn =

100010

;int

readint()

//計算幾何

intsgn

(db x)

struct point

point operator

+(point b);}

point operator

-(point b);}

point operator

/(db k);}

point operator

*(db k);}

bool

operator

==(point b)};

db cross

(point a, point b)

//求×積

db distance

(point a, point b)

db polygon_area

(point *p,

int n)

return area/2;

//是按照三角形來算,所以這裡統一除2

}point polygon_center

(point *p,

int n)

return ans/area/6;

}//判斷兩線段相交

bool

cross_segment

(point a, point b, point c, point d)

bool

cmpxy

(point a, point b)

bool

cmpy

(point a, point b)

point p[maxn]

, tmp_p[maxn]

;//尋找最近點對

db closest_pair

(int left,

int right)

sort

(tmp_p, tmp_p + k, cmpy)

;_for

(i,0

, k)

}return dis;

}int

main()

sort

(p, p + n, cmpxy)

;printf

("%.2f\n"

,closest_pair(0

, n -1)

/2);

}return0;

}

解題思路

設點的個數 n

nn, 先計算出一開始的最近點對距離 d

dd ,儲存他們的位置。

再計算分別去掉這兩個點之後的最近點對距離 d1,

d2

d_1,d_2

d1​,d2

​ 。最後的結果即為 d×(

n−2)

+d1+

d2

d\times(n-2)+d_1+d_2

d×(n−2

)+d1

​+d2

​。注意事項

1.開 lon

glon

glong\ long

longlo

ng。2.分治法求解的時候利用好 opt

optop

t 標記。

參考**

#include

using

namespace std;

#define local

//提交的時候一定注釋

#define _for(i, a, b) for(int i = (a); i < (b); ++i)

#define _rep(i, a, b) for(int i = (a); i <= (b); ++i)

#define pb push_back

#define vi vector

#define mp make_pair

#define lowbit(x) ((x) & (-x))

typedef

long

long ll;

typedef

double db;

const db eps =

1e-8

;//定義浮點數誤差

const

int mod =

998244353

;const

int maxn =

1e5+10;

const ll inf =

1e18

;int

readint()

//計算幾何

intsgn

(db x)

struct point

point operator

+(point b);}

point operator

-(point b);}

point operator

/(ll k);}

point operator

*(ll k);}

bool

operator

==(point b)};

ll distance

(point a, point b)

bool

cmpxy

(point a, point b)

bool

cmpy

(point a, point b)

point p[maxn]

, tmp_p[maxn]

;int pos[3]

;//尋找最近點對

ll ans = inf;

//開的是全域性變數

void

closest_pair

(int left,

int right,

int opt)}}

return;}

int mid =

(left + right)/2

;closest_pair

(left, mid, opt)

;closest_pair

(mid +

1, right, opt)

;int k =0;

_rep

(i, left, right)

sort

(tmp_p, tmp_p + k, cmpy)

;_for

(i,0

, k)}}

}}intmain()

sort

(p, p + n, cmpxy)

; point tmp;

ll sum =0;

ans = inf;

closest_pair(0

, n -1,

-1);

sum +

=(n -2)

* ans;

ans = inf;

closest_pair(0

, n -

1, pos[0]

);sum +

= ans;

ans = inf;

closest_pair(0

, n -

1, pos[1]

);sum +

= ans;

printf

("%lld\n"

, sum);}

return0;

}

演算法競賽從入門到高階

二維幾何 平面最近點對

存個模板 是用分治寫的時間複雜度 nlogn 但是本題好像還有一種玄學做題法 我們充分發揚人類智慧型 將所有點全部繞原點旋轉同乙個角度,然後按x座標排序 根據數學直覺,在隨機旋轉後,答案中的兩個點在陣列中肯定不會離得太遠 所以我們只取每個點向後的5個點來計算答案 這樣速度快得飛起,在n 100000...

平面最近點對 n 2和nlogn做法 計算幾何

題目描述 給定平面上n個點,找出其中的一對點的距離,使得在這n個點的所有點對中,該距離為所有點對中最小的。既然是暴力做法,那肯定是非常非常暴力的做法,無疑是列舉。列舉i從1 n,j從i 1 n,用距離公式計算出第i個點和第j個點的距離,然後找到最小值即可。放一道模板題吧!ac include inc...

三點順序(計算幾何入門)

現在給你不共線的三個點a,b,c的座標,它們一定能組成乙個三角形,現在讓你判斷a,b,c是順時針給出的還是逆時針給出的?如 圖1 順時針給出 圖2 逆時針給出 每行是一組測試資料,有6個整數x1,y1,x2,y2,x3,y3分別表示a,b,c三個點的橫縱座標。座標值都在0到10000之間 輸入0 0...