bzoj 2648 (kdtree模板题)

这天,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 3
1 1
2 3
2 1 2
1 3 3
2 4 2

Sample Output


1

2

转:http://www.cnblogs.com/ljh2000-jump/p/5513620.html


#include 
using namespace std;
 
const int MAXN = 1000011;
const int inf=(1<<30);
int n,m;
int nowD;
int root;
int ans;
int ql,qr;
 
struct node
{
    int Min[2],Max[2];
    int d[2];
    int l,r;
}t[MAXN*2];
 
inline int getint()
{
    int w=0,q=0;
    char c=getchar();
    while((c<'0'||c>'9')&&c!='-') c=getchar();
    if(c=='-') q=1,c=getchar();
    while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar();
    return q?-w:w;
}
 
inline int dist(int p)
{
    int dis=0;
    if(qlt[p].Max[0]) dis+=ql-t[p].Max[0];
    if(qrt[p].Max[1]) dis+=qr-t[p].Max[1];
    return dis;
}
 
inline bool cmp(node q,node qq)
{
    if(q.d[nowD]==qq.d[nowD]) return q.d[!nowD]t[now].Max[0]) t[now].Max[0]=t[t[now].l].Max[0];
        if(t[t[now].l].Max[1]>t[now].Max[1]) t[now].Max[1]=t[t[now].l].Max[1];
        if(t[t[now].l].Min[0]t[now].Max[0]) t[now].Max[0]=t[t[now].r].Max[0];
        if(t[t[now].r].Max[1]>t[now].Max[1]) t[now].Max[1]=t[t[now].r].Max[1];
        if(t[t[now].r].Min[0]t[p].Max[0]) t[p].Max[0]=t[now].Max[0];
        if(t[now].Max[1]>t[p].Max[1]) t[p].Max[1]=t[now].Max[1];
        if(t[now].Min[0]=t[p].d[D])
        {
            if(!t[p].r)
            {
                t[p].r=now;
                return ;
            }
            else p=t[p].r;
        }
        else
        {
            if(!t[p].l)
            {
                t[p].l=now;
                return ;
            }
            else p=t[p].l;
        }
        D=!D;
    }
}
 
inline void kd_query(int p)
{
    int dl,dr,d0;
    d0=abs(t[p].d[0]-ql)+abs(t[p].d[1]-qr);
    if(d0



你可能感兴趣的:(kdtree)