bzoj 2468 kdtree


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 输出一个最小距离
 
考察知识点kd-tree
kd-tree学习推荐 思路和 详细讲解
代码参考blog http://blog.csdn.net/lych_cys/article/details/50809141
ACcode:
#include 
#define maxn 1000006
#define inf 1000000000
using namespace std;
int n,m,dim,rt,ans;
inline int CIN(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
struct node{
    int p[2],x[2],y[2];
}a[maxn];
bool cmp(node x,node y){
    return x.p[dim]>1;dim=now;
        nth_element(a+l,a+k,a+r+1,cmp);
        add(k,a[k]);
        if(l


你可能感兴趣的:(kd-tree)