模板 平面最近點對 分治

2021-08-19 03:19:44 字數 1689 閱讀 2509

傳送門:洛谷-平面最近點對

給定平面上n個點,找出其中的一對點的距離,使得在這n個點的所有點對中,該距離為所有點對中最小的。

2≤n≤200000

一、分治

按x排序,左右分治,邊界處理一下就好了。

**:

#include

#include

#include

#include

#include

#define db double

const

int inf=0x7fffffff;

using

namespace

std;

typedef

long

long ll;

const

int n=2e5+10;

struct pp[n];

int n,in[n],cnt;

inline db sqr(int x)

inline db fab(db x)

inline db min(db a,db b)

bool cmp(const p &a,const p &b)

}sort(in+1,in+cnt+1,cmq);

for(int i=1;i<=cnt;i++)

int main()

sort(p+1,p+n+1,cmp);

printf("%.4lf\n",merge(1,n));

return

0;}

二、掃瞄

按y排序,從上往下掃,優化看**。

**:

#include

#include

#include

#include

#include

#define db double

const int inf=0x7fffffff;

using namespace std;

typedef long long ll;

const int n=2e5+10;

struct pp[n];

db ans;

int n,head[n],to[n],nxt[n],cnt,tot;

inline db s

qr(int x)

inline db fab(db x)

inline db min(db a,db b)

inline void lk(int u,int v)

inline bool cmq(const p &a,const p &b)

int main()

sort(p+1,p+n+1,cmq);

lk(1,1);++cnt;

for(int i=2;i<=n;i++)else

lk(cnt,i);

}for(int i=1;iint mx=i+1;

while(mx<=cnt && (db)(p[to[head[mx]]].y-p[to[head[i]]].y)<=ans)

e=to[qw];

if(p[e].x

<=p[ty].x)

ans=min(dist(p[e],p[ty]),ans);}}

mx++; }}

printf("%.4lf\n",ans);

return

0;}

最近點對分治演算法 模板

最近點對分治演算法 對於平面上給定的n個點,給出所有點的座標,即輸入是平面上的n個點,輸出是n點中具有最短距離的兩點。分析 maxdis sqrt 2 3 r 2 1 2 r 2 例題可見 具體函式 如下 內含注釋 double dis node a,node b double solve int ...

最近點對分治演算法

對於平面上給定的 n nn 個點,給出所有點的座標,即輸入是平面上的 n nn 個點,輸出是 n nn 點中具有最短距離的兩點。法一 暴力,時間複雜度 o n 2 o n 2 o n2 法二 分支,時間複雜度 o n log n o nlog n o nlog n 當然,此部落格 二。對於乙個點我們...

平面最近點對問題 分治

在與聯盟的戰鬥中屢戰屢敗後,帝國撤退到了最後乙個據點。依靠其強大的防禦系統,帝國擊退了聯盟的六波猛烈進攻。經過幾天的苦思冥想,聯盟將軍亞瑟終於注意到帝國防禦系統唯一的弱點就是能源 該系統由n個核電站 能源,其中任何乙個被摧毀都會使防禦系統失效。將軍派出了n個 進入據點之中,打算對能源站展開一次突襲。...