題目鏈結
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中...