平面最近點對問題 分治

2021-09-22 16:44:29 字數 1564 閱讀 4542

在與聯盟的戰鬥中屢戰屢敗後,帝國撤退到了最後乙個據點。

依靠其強大的防禦系統,帝國擊退了聯盟的六波猛烈進攻。

經過幾天的苦思冥想,聯盟將軍亞瑟終於注意到帝國防禦系統唯一的弱點就是能源**。

該系統由n個核電站**能源,其中任何乙個被摧毀都會使防禦系統失效。

將軍派出了n個**進入據點之中,打算對能源站展開一次突襲。

不幸的是,由於受到了帝國空軍的襲擊,他們未能降落在預期位置。

作為一名經驗豐富的將軍,亞瑟很快意識到他需要重新安排突襲計畫。

他現在最想知道的事情就是哪個**距離其中任意乙個發電站的距離最短。

你能幫他算出來這最短的距離是多少嗎?

輸入格式

輸入中包含多組測試用例。

第一行輸入整數t,代表測試用例的數量。

對於每個測試用例,第一行輸入整數n。

接下來n行,每行輸入兩個整數x和y,代表每個核電站的位置的x,y座標。

在接下來n行,每行輸入兩個整數x和y,代表每名**的位置的x,y座標。

輸出格式
每個測試用例,輸出乙個最短距離值,結果保留三位小數。

每個輸出結果佔一行。

資料範圍
1≤n≤100000,

0≤x,y≤1000000000

輸入樣例:24

0 00 1

1 01 1

2 22 3

3 23 3

40 0

0 00 0

0 00 0

0 00 0

0 0輸出樣例:

1.414

0.000

平面最近點對問題詳解

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

using namespace std;

typedef

long

long

int ll;

const

int n =

2e5+10;

struct pa[n]

, b[n]

;bool cmp

(p a, p b)

bool cmp1

(p a, p b)

double

dis(p a, p b)

double

solve

(int l,

int r)

}return ans;

}int

main()

for(

int i = n; i <

2* n; i++

) n *=2

;sort

(a, a + n, cmp)

;printf

("%0.3f\n"

,solve(0

, n -1)

);}return0;

}

平面最近點對問題 分治

1 演算法描述 已知集合s中有n個點,一共可以組成n n 1 2對點對,蠻力法就是對這n n 1 2對點對逐對進行距離計算,通過迴圈求得點集中的最近點對 2 演算法時間複雜度 演算法一共要執行 n n 1 2次迴圈,因此演算法複雜度為o n2 實現 利用兩個for迴圈可實現所有點的配對,每次配對算出...

平面最近點對 cdq分治

cdq分治可以很好地處理平面點對間具有某種性質的值或數量,最近點對也不例外。參考oi wiki 先對x排序,cdq返回點集內部最近點對的距離記為mindis。考慮如何合併左右區間,對於處於點集a的點a和b的點b,顯然 a.x b.x m indi s a.x b.x mindis a.x b x m...

演算法 分治 平面最近點對

給定平面上n個點,找出其中的一對點的距離,使得在這n個點的所有點對中,該距離為所有點對中最小的 將每乙個點按照橫座標排序,然後分治區間 1,n 1,n 1,n 再內乙個遞迴函式內 如下 include using namespace std struct node a 300000 int temp...