我們先求出只有一種點找兩個距離最近的點的方法,然後再延伸到找兩種點中的最近距離。
假如只有一種點,我們先按照x來排序,且左半部分為(left-mid),右半部分為(mid+1-r)
我們先求出左半部分(left-mid)點的最小值,再求出右邊部分點的最小值(mid+1-right),再合併求兩部分的最小值。
由於兩半部分的最小值肯定小於等於左半部分的最小值和右半部分的最小值,設這個最小值為min,則新的最小值的x座標區間一定在(mid-min—mid+min)之間。
於是我們可以做圓,在圓內的點我們才列舉,因為總共有n個點,所以最多有n個圓,並且我們可以證明,乙個圓內的點最多有6個。
證明如下:
考慮最極端的情況,即乙個點在分界線mid上
半圓形不太好看出規律,我們轉為長方形,並劃分成6個部分:
可以看出,列舉點的數量很少,可以直接列舉。
用分治做題的時間複雜度為o(n log n)
當有2種點的時候,可以把同種點之間的距離計為正無窮,這樣可以保證出現的點都是不同型別的點。
**如下:
#include usingnamespace
std;
intt,n;
struct
node
} a[
200005],b[200005
];double
dist(node x,node y)
double dfs(int l,int
r)
for(i=1; i<=len; i++)
for(j=i+1; j<=len&&b[j].y-b[i].y<=res; j++)
res=min(res,dist(b[i],b[j]));
return
res;
}int
main()
return0;
}
AcWing 119 襲擊 平面最近點對
經典問題,平面最近點對,使用分治來解決 把所有點按橫座標排序,分治求解距離 合併時將兩邊的最近點對距離也比較一下 屬於不同集合的點比較距離時判斷一下即可 include include include include include include includeusing namespace st...
題解 襲擊(平面最近點對)
題目描述 在與聯盟的戰鬥中屢戰屢敗後,帝國撤退到了最後乙個據點。依靠其強大的防禦系統,帝國擊退了聯盟的六波猛烈進攻。經過幾天的苦思冥想,聯盟將軍亞瑟終於注意到帝國防禦系統唯一的弱點就是能源 該系統由n個核電站 能源,其中任何乙個被摧毀都會使防禦系統失效。將軍派出了n個 進入據點之中,打算對能源站展開...
AcWing 119襲擊 平面點間對問題
思路 把所有點按橫座標排序 開始分治 l,r 遞迴到 l,r 上只有乙個點,或者有倆個點 找到中間點的橫座標,找到遞迴時最小間間距res 找到橫座標屬於min x res 到 min x res 的點 放到temp陣列中 將temp陣列按找y值排序 用暴力找到既屬於以邊長為res的正方形內 的倆個點...