這個題要求kd樹支援兩個操作。
1.插入乙個新的點。
2.查詢某個點最近曼哈頓距離。
注意查詢曼哈頓距離和查詢歐幾里得距離,是有區別的。(估價函式不同)。
1 #include 2 #include 3 #include 4 #include 5 #include 6view codeusing
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 }
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樹是二進位制空間分割樹的特殊的情況。大概思路就是每次確定乙個軸,將...