poj 3714 Raid(平面最近點對)

2021-06-18 23:38:52 字數 1249 閱讀 5367

給出兩個點集,然後求兩個點集之間的最近距離。

思路:開始用的旋轉卡殼,兩個點集先求凸包,這樣就變成了兩個凸包間最近距離,但是死活tle,然後就換了平面最近點對來做,把兩個點集標記一下,判斷下是不是在同乙個點集裡就行了

#include #include #include using namespace std;

const int n=200002;

const double eps=1e-10;

const double inf=1e20;

struct point

p[n];

int n,o[n],on;

inline double dis(const point & a,const point & b)

inline int dcmp(double a,double b)

inline bool cmp_x(const point & a,const point & b)

inline bool cmp_y(const int & a,const int & b)

inline double min(double a,double b)

{ return a>1,i,j;

double getret,getdis,ret=inf;

point getx,gety;

if(s>=t) return ret;

for(i=mid;i>=s && ! dcmp(p[i].x,p[mid].x);--i);

ret=search(s,i,x,y);

for(i=mid;i<=t && ! dcmp(p[i].x,p[mid].x);++i);

getret=search(i,t,getx,gety);

if(getret=s && dcmp(p[mid].x-p[i].x,ret)<=0;--i)

o[++on]=i;

for(i=mid+1;i<=t && dcmp(p[i].x-p[mid].x,ret)<=0;++i)

o[++on]=i;

sort(o+1,o+on+1,cmp_y);

for(i=1;i<=on;++i)

{ for(j=1;j<=10;++j)

{ if(p[o[i]].flag==p[o[i+j]].flag)

continue;

getdis=dis(p[o[i]],p[o[i+j]]);

if(i+j<=on&&getdis

POJ 3714 Raid 平面最近點對

題目大意 給出兩個集合的點,問這兩個集合之間最近的點對的距離是多少。思路 先要知道平面最近點對的分治演算法,剩下的就簡單了,只需要在更新答案的時候判斷一下兩個點是否屬於兩個集合就可以了。分治演算法總是十分神奇的。對於平面最近點對,首先按照x座標排序,然後遞迴進行分治,每次分治時,先獲得分治得到的結果...

poj 3714 Raid(平面最近點對)

題意 給定在同一平面中,同數量黑點與白點的座標值,求其中最近黑白點對的距離。大水題一遍過qaq 稍微做點工作就是把同顏色的點,做上標記,同顏色的點就使其之間距離inf 分治or暴力 剪枝都可以過。include include include include include using namesp...

POJ 3714 Raid 最近點對

求最近點對,只不過這兩個點需要屬於不同的集合,那麼就給兩個集合的點分別標記乙個id號,在計算時,兩個集合合併起來,並排序,遞迴求解,只不過,求兩點距離時,如果id號是同一集合的,直接返回乙個很大的數就行了,這樣就跟求乙個集合的最近點對沒什麼區別了。id sdj22251 prog calfflac ...