bzoj2648 kd樹 SJY擺棋子

2021-08-10 03:03:29 字數 2069 閱讀 3759

2648: sjy擺棋子

time limit: 20 sec memory limit: 128 mb

submit: 4914 solved: 1688

[submit][status][discuss]

description

這天,sjy顯得無聊。在家自己玩。在乙個棋盤上,有n個黑色棋子。他每次要麼放到棋盤上乙個黑色棋子,要麼放上乙個白色棋子,如果是白色棋子,他會找出距離這個白色棋子最近的黑色棋子。此處的距離是 曼哈頓距離 即(|x1-x2|+|y1-y2|) 。現在給出n<=500000個初始棋子。和m<=500000個操作。對於每個白色棋子,輸出距離這個白色棋子最近的黑色棋子的距離。同乙個格仔可能有多個棋子。

input

第一行兩個數 n m

以後m行,每行3個數 t x y

如果t=1 那麼放下乙個黑色棋子

如果t=2 那麼放下乙個白色棋子

output

對於每個t=2 輸出乙個最小距離

sample input

2 31 1

2 32 1 2

1 3 3

2 4 2

sample output

hint

kdtree可以過

source

鳴謝 孫嘉裕

sol:

使用kd樹就可以輕鬆的a掉這題

不會重構的kd樹,我的kd樹就是個樸素暴力。

kd樹對加入樹中的點進行劃分,在奇數層按照x座標排序,在偶數層按照y座標排序,可以把多維空間上的點通過有技巧的劃分來大大降低搜尋的複雜度。對於樹上的乙個節點,先把這個節點理論中可能出現的最優解和當前答案比對,如果比答案優則向下拓展。

#include

#include

#include

#include

#include

#include

#include

using namespace std;

const int n=1010000;

const int inf=1e9;

int n,m;

int l[n],r[n];

struct cc

a[n],tr[n];

int dis(cc c,int a,int b)

int f;

bool cmp(cc a,cc b)

void updata(int k)

void build(int &k,int flag,int l,int r)

inline bool cmp_x(int k,int

x)inline bool cmp_y(int k,int

y)void insert(int &k,int flag,int

x,int

y) int d=flag?cmp_y(k,y):cmp_x(k,x);

if(d) insert(r[k],flag^1,x,y);

else insert(l[k],flag^1,x,y);

if(d) d=r[k];

else d=l[k];

tr[k].mix=min(tr[k].mix,tr[d].mix);

tr[k].max=max(tr[k].max,tr[d].max);

tr[k].miy=min(tr[k].miy,tr[d].miy);

tr[k].may=max(tr[k].may,tr[d].may);

}int pre_dis(cc c,int a,int b)

int ans;

void query(int k,int

x,int

y) else

// if(l[k]&&ans>pre_dis(tr[l[k]],x,y)) query(l[k],x,y);

//if(r[k]&&ans>pre_dis(tr[r[k]],x,y)) query(r[k],x,y);

} inline int

read()

int root;

int main()

}

bzoj2648 sjy擺棋子 kd樹

這天,sjy顯得無聊。在家自己玩。在乙個棋盤上,有n個黑色棋子。他每次要麼放到棋盤上乙個黑色棋子,要麼放上乙個白色棋子,如果是白色棋子,他會找出距離這個白色棋子最近的黑色棋子。此處的距離是 曼哈頓距離 即 x1 x2 y1 y2 現在給出n 500000個初始棋子。和m 500000個操作。對於每個...

bzoj2648 SJY擺棋子 k d樹

這天,sjy顯得無聊。在家自己玩。在乙個棋盤上,有n個黑色棋子。他每次要麼放到棋盤上乙個黑色棋子,要麼放上乙個白色棋子,如果是白色棋子,他會找出距離這個白色棋子最近的黑色棋子。此處的距離是 曼哈頓距離 即 x1 x2 y1 y2 現在給出n 500000個初始棋子。和m 500000個操作。對於每個...

BZOJ2648 SJY擺棋子 k d樹

題目鏈結 思路 二維的k d k dk d樹,查詢的時候其實就是貪心搜尋 剪枝,k d k dk d樹的建樹和查詢網上很多,插入的時候就是暴力插入。可為啥我的暴力插入超時了,話說應該要像替罪羊樹那樣維護k d k dk d樹的平衡性吧。暴力重建 弱剪枝還超時了。include define endl...