BZOJ2648 SJY擺棋子 k d樹

2021-08-28 19:52:37 字數 2266 閱讀 9826

題目鏈結

思路:

二維的k−d

k-dk−

d樹,查詢的時候其實就是貪心搜尋+剪枝,k−d

k-dk−

d樹的建樹和查詢網上很多,插入的時候就是暴力插入。可為啥我的暴力插入超時了,話說應該要像替罪羊樹那樣維護k−d

k-dk−

d樹的平衡性吧。暴力重建+弱剪枝還超時了。

#include#define endl "\n"

typedef long long ll;

const int maxn = 1e6 + 100;

const int inf = 1e9 + 10;

const double alpha = 0.75;

using namespace std;

const int max = 100000;

char buf[max], *ps = buf, *pe = buf + 1;

inline void rnext()

template inline bool in(t &ans) while(!isdigit(*ps) && ps != pe);

if(ps == pe) return false;//eof

do while(isdigit(*ps) && ps != pe);

ans *= f;

return true;

}char bufout[max], outtmp[50],*pout = bufout, *pend = bufout + max;

inline void write()

inline void out_char(char c)

inline void out_str(char *s)

}template inline void out_int(t x)

if(x < 0) x = -x,out_char('-');

int len = 0;

while(x)

outtmp[len] = 0;

for(int i = 0, j = len - 1; i < j; i++,j--) swap(outtmp[i],outtmp[j]);

out_str(outtmp);

}struct point

void input()

bool operator < (point p) const

} p[maxn];

struct kd_tree kd[maxn];

int n, m, t, kase = 1, stk[maxn], cnt;

inline void update(int o)

}inline bool need_build(int o)

void dfs(int o, int &tot)

inline void create_node(int &o, point now, int sp)

void build(int &o, int l, int r, int sp)

inline int get_dis(point p1, point p2)

inline bool enter(int o, int ans, point now, int now_dis, int sp)

return true;

}void min_distance(int o, point now, int sp, int &ans)

void insert(int &o, point now, int sp)

now.split = sp;

int s = kd[o].p < now;

insert(kd[o].son[s], now, sp ^ 1);

update(o);

if(!need_build(o)) return ;

int tot = 0; dfs(o, tot);

build(o, 0, tot - 1, sp);

}int main()

in(n); in(m);

kd[0].size = 0;

for(int i = 0; i < n; i++) p[i].input();

int root;

build(root, 0, n - 1, 0);

for(int i = 0, flag, x, y; i < m; i++)

}write();

return 0;

}

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 kd樹 SJY擺棋子

2648 sjy擺棋子 time limit 20 sec memory limit 128 mb submit 4914 solved 1688 submit status discuss description 這天,sjy顯得無聊。在家自己玩。在乙個棋盤上,有n個黑色棋子。他每次要麼放到棋盤上...