傳送門:洛谷-平面最近點對
給定平面上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個 進入據點之中,打算對能源站展開一次突襲。...