BJWC 2014 資料 題解

2021-10-09 05:21:31 字數 1793 閱讀 9179

題目傳送門

題目大意:給出 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 總時間複雜度...