BZOJ2716 天使玩偶 kd樹

2022-05-27 13:51:08 字數 1342 閱讀 8061

這個題要求kd樹支援兩個操作。

1.插入乙個新的點。

2.查詢某個點最近曼哈頓距離。

注意查詢曼哈頓距離和查詢歐幾里得距離,是有區別的。(估價函式不同)。

1 #include 2 #include 3 #include 4 #include 5 #include 6

using

namespace

std;

7const

int maxn=300000+100;8

const

int inf=2147000000;9

10struct

kdnodep[maxn],q;

15int

n,m,cmpno;

16int

lc[maxn],rc[maxn];

17int

cmp(kdnode a,kdnode b)

20void maintain(int

o)26}27

28void build(int&o,int l,int r,int

d)33

int m=l+(r-l)/2

;34 cmpno=d;

35 nth_element(p+l,p+m,p+r+1

,cmp);

36 o=m;

37 p[m].div=d;

38if(l==r)

44 build(lc[o],l,m-1,d^1

);45 build(rc[o],m+1,r,d^1

);46

maintain(o);47}

48int cal(int

o)55

void insert(int& o,int

d)66

int t=q.x[d]-p[o].x[d];

67if(t>=0

)else

72maintain(o);73}

74int

ans;

75void query(int o,int

d)else88}

8990

intmain()

97int

root;

98 p[0].mnn[0]=p[0].mnn[1]=inf;

99 p[0].mxn[0]=p[0].mxn[1]=-inf;

100 build(root,1,n,0

);101

for(int i=1;i<=m;i++)else

113}

114return0;

115 }

view code

BZOJ2716 天使玩偶

乙個平面直角座標系,座標 1 le x,y le10 6 n n le10 6 次操作,操作包含以下兩種 新增乙個點 x,y 詢問離 x,y 最近的點的距離。分別統計左下 左上 右上 右下的最近的點,每次使用cdq分治。樹狀陣列維護最小值。有乙個一樣的題是sjy擺棋子,不過cdq會被卡,需要用kd樹...

刷題總結 天使玩偶(bzoj2716)

學了cdq後近期最後一道題 然而tm還是搞了1個半小時才tm搞出來 先說思路 對於絕對值,我們採取類似於旋轉整個圖的方法,也就是說共計三次翻轉再加上原來的圖,每次旋轉90度,算出點在旋轉後的對應座標 具體看 中的注釋部分 然後對於乙個詢問,每次只算它左上角的點的貢獻,這樣就有乙個三維偏序 時間,x,...

bzoj2716 Violet 3 天使玩偶

傳送門 這題好像有cdq分治做法 不過我太菜了沒聽懂 於是我打了一發kdtree 度娘 k d樹 k dimensional樹的簡稱 是一種分割k維資料空間的資料結構。主要應用於多維空間關鍵資料的搜尋 如 範圍搜尋和最近鄰搜尋 k d樹是二進位制空間分割樹的特殊的情況。大概思路就是每次確定乙個軸,將...