題目傳送門
題目大意:給出 n
nn 個點,有 m
mm 次操作,每次為:1、新增乙個點;2、求點集中離詢問點最近的點到詢問點的距離;3、詢問點集中離詢問點最遠的點到詢問點的距離。
k-d tree裸題。
先維護一下每棵子樹對應的矩陣。
找最近點的剪枝是:先去左右子樹中離離詢問點比較近的矩陣。
找最遠點的剪枝:類似的,先去比較遠的矩陣。
**如下:
#include
#include
#include
using
namespace std;
#define maxn 500010
#define inf 999999999
#define zuo ch[0]
#define you ch[1]
#define alpha 0.75
int n,m;
const
int k=2;
struct pointq[maxn]
;int
dis(point x,point y)
int c;
bool
cmp(point x,point y)
struct kd_node *root=
null
,*null=
null
;struct kd_node
kd_node()
void
check()
}int
dis_min
(point &z)
intdis_max
(point &z)};
void
init()
}void
build_kdtr
(kd_node *
&now,
int l,
int r,
int co=0)
void
erase
(kd_node *
&now)
void
rebuild
(kd_node *
&now)
void
add_node
(kd_node *
&now,point x,
int co=0,
bool v=
false
) now-
>size++
; c=co;
int to=
cmp(x,now-
>x)^1
;bool tf=
false;if
(now-
>size*alpha<=now-
>ch[to]
->size+
1)tf=
true
;add_node
(now-
>ch[to]
,x,(co+1)
%k,v|tf);if
(!v&&tf)
rebuild
(now)
; now-
>
check()
;}int ans;
void
ask_min
(kd_node *
&now,point x)
void
ask_max
(kd_node *
&now,point x)
intmain()
}}
P4570 BJWC2011 元素題解
相傳,在遠古時期,位於西方大陸的 magic land 上,人們已經掌握了用魔法礦石煉製法杖的技術。那時人們就認識到,乙個法杖的法力取決於使用的礦石。例如,使用兩個同樣的礦石必將發生 魔法抵消 因為這兩種礦石的元素序號相同,異或起來為零。並且人們有了測定魔力的有效途徑,已經知道了 合成出來的法杖的魔...
題解 NOI2014購票
我們首先get出斜率優化方程 dp v dis v p u dis u p u q u dp u left 0 dis u dis v lim u right 那麼 y dp v x dis v k p u 我們所要做的就是維護乙個下凸包以維護最小的b值。現在有兩個本題的難點 首先,轉移到 u 點的...
題解 清華集訓2014 玄學
題目傳送門 給出乙個 n 個點的序列,有 m 次操作,每次操作為以下兩種 二進位制分組好啊!考慮修改操作,我們發現其實每次修改,都會有一段一段的區間是相同的變化規則,我們可以根據這個將兩個操作進行合併。考慮時間複雜度,你每次增加的時候最多增加 3 段,於是總段數就是 n log 2 n 總時間複雜度...