洛谷1429 平面最近點對(KDTree)

2021-09-02 22:59:38 字數 1863 閱讀 8195

題目鏈結

qwq(明明可以直接分治過掉的)

但是還是當作聯絡了

首先,對於這種點的題,很顯然的套路,我們要維護乙個子樹mx[

i],m

n[i]

mx[i],mn[i]

mx[i],

mn[i

]分別表示每個維度的最大值和最小值

(這裡有乙個要注意的東西!就是我們upup

up的時候,要判斷一下當前是否還有左/右兒子)

bool operator<

(kd a,kd b)

voidup(

int root)

if(t[root]

.r)}

}void

build

(int

&x,int l,

int r,

int dd)

其實這個題最重要的是估價函式該怎麼寫。

首先我們很容易發現,因為我們要求的是這個子樹理論上到那個點的最短距離,所以我們需要這麼考慮,如果當前點的座標在mn到

mx

mn到mx

mn到m

x之間的話,那麼理論上的最短距離就是0,否則就是當前這一維度距離mn和

mx

mn和mx

mn和m

x較近的距離

double

calc

(kd a,kd b)

return

sqrt

(tmp)

;}

其實剩下的就是和普通的kdtree差不多了

直接上就好了

#include

#include

#include

#include

#include

#include

#include

#include

#define mk makr_pair

#define ll long long

using namespace std;

inline

intread()

while

(isdigit

(ch)

)return x*f;

}const

int maxn =

2e5+

1e2;

struct kd

;kd t[maxn]

,now;

int n,m,root;

int ymh;

double ans;

double tmp;

int ii =0;

bool operator<

(kd a,kd b)

voidup(

int root)

if(t[root]

.r)}

}void

build

(int

&x,int l,

int r,

int dd)

double

getdis

(int a,kd b)

return

sqrt

(tmp);}

double

calc

(kd a,kd b)

return

sqrt

(tmp);}

void

query

(int x)

else

}int

main()

printf

("%.4lf"

,tmp)

;return0;

}

洛谷P1429 平面最近點對(加強版)

給定平面上n個點,找出其中的一對點的距離,使得在這n個點的所有點對中,該距離為所有點對中最小的 輸入格式 第一行 n 2 n 200000 接下來n行 每行兩個實數 x y,表示乙個點的行座標和列座標,中間用乙個空格隔開。輸出格式 僅一行,乙個實數,表示最短距離,精確到小數點後面4位。輸入樣例 1 ...

洛谷P1429 平面最近點對(加強版)

核心是分治演算法 分別根據點的 x,y 值進行排序 在 x 軸上劃一道垂線,將點均分成兩半 假設最近點對都在左 右部分,遞迴計算左 右半部分的最短距離 並返回較小值 dis 假設最近點對分別在左右兩個部分,橫跨中心的豎線.中心線為中心,2 dis 為寬度畫乙個矩形,橫跨中心線的最近點對 candid...

p1429 平面最近點對

題意 給平面n個點,求最近的兩個點的距離。思路 運用分治思想,對於n個點,可以分成t n 2 t n 2 的規模,分界線是x座標的中位數,假設左邊點集合為s1,右邊點集合為s2,那麼最小值存在於以下三種情況中。1.s1中任意兩點距離的最小距離 2.s2中任意兩點距離的最小距離 3.s1中的點到s2中...