bzoj 2648

来源:互联网 发布:淘宝玻璃茶具销量前十 编辑:程序博客网 时间:2024/05/29 17:20

kd_tree;
目前仍理解不足…

#include<bits/stdc++.h>#define rep(i,k,n) for(int i=k;i<=n;i++)using namespace std;const int N=500005;const int inf=0x7f7f7f7f;struct P{    int d[2],mn[2],mx[2],l,r;    int& operator[](int x){return d[x];}        P(int x=0,int y=0)        {l=0,r=0;d[0]=x,d[1]=y;}  }p[N];int n,m,root=0,D;bool operator<(P a,P b){return a[D]<b[D];}struct kd_tree{    P t[2*N],T;    int ans;    void up(int x){        P l=t[t[x].l],r=t[t[x].r];        if(t[x].l)rep(i,0,1)t[x].mn[i]=min(t[x].mn[i],l.mn[i]),t[x].mx[i]=max(t[x].mx[i],l.mx[i]);        if(t[x].r)rep(i,0,1)t[x].mn[i]=min(t[x].mn[i],r.mn[i]),t[x].mx[i]=max(t[x].mx[i],r.mx[i]);    }    void build(int& x,int l,int r,int now){        if(l>r)return;        D=now;        int mid=(l+r)>>1;        nth_element(p+l,p+mid,p+r+1);        x=mid;        t[x]=p[mid];        t[x].mn[0]=t[x].mx[0]=t[x][0];        t[x].mn[1]=t[x].mx[1]=t[x][1];        build(t[x].l,l,mid-1,now^1);        build(t[x].r,mid+1,r,now^1);        up(x);    }    inline int dis(P a,P b){return abs(a[0]-b[0])+abs(a[1]-b[1]);}    int get(int k,P x){        int tmp=0;        rep(i,0,1)tmp+=max(0,t[k].mn[i]-x[i]);        rep(i,0,1)tmp+=max(0,x[i]-t[k].mx[i]);        return tmp;    }    void ins(int x,int now){        if(T[now]<t[x][now]){            if(t[x].l)ins(t[x].l,now^1);            else{                t[x].l=++n;t[n]=T;                rep(i,0,1)t[n].mn[i]=t[n].mx[i]=t[n][i];            }        }        else{            if(t[x].r)ins(t[x].r,now^1);            else{                t[x].r=++n;t[n]=T;                rep(i,0,1)t[n].mn[i]=t[n].mx[i]=t[n][i];            }        }        up(x);    }    void que(int x){        int d,d1=inf,d2=inf;        d=dis(t[x],T);        ans=min(ans,d);        if(t[x].l)d1=get(t[x].l,T);        if(t[x].r)d2=get(t[x].r,T);        if(d1<d2){            if(d1<ans)que(t[x].l);            if(d2<ans)que(t[x].r);        }        else{            if(d2<ans)que(t[x].r);            if(d1<ans)que(t[x].l);        }    }    void insert(P x){        T=x;ins(root,0);    }    int query(P x){        ans=inf;T=x;que(root);        return ans;    }}kd;int main(){//freopen("in.in","r",stdin);    scanf("%d%d",&n,&m);    rep(i,1,n){scanf("%d%d",&p[i][0],&p[i][1]);}    kd.build(root,1,n,0);    int op,x,y;    while(m--)    {        scanf("%d%d%d",&op,&x,&y);        if(op==1)kd.insert(P(x,y));        else printf("%d\n",kd.query(P(x,y)));    }    return 0;}
0 0
原创粉丝点击