您的位置:首页 > 其它

k-d tree背诵用模板

2017-03-26 23:43 176 查看

int xycmp;

struct dian

{int xy[2],xiao[2],da[2];

}a
;

bool cmp(dian a,dian b)

{

     return a.xy[xycmp]<b.xy[xycmp];

}

struct kdtree

{

int xia
[2];

dian s
,q;

   void up(int k)

   {

       int l=xia[k][0],r=xia[k][1];

   for(i=0;i<2;i++)

   {

    if(l)s[k].xiao=min(s[k].xiao,s[l].xiao),s[k].da=max(s[k].da,s[l].da);

    if(r)s[k].xiao=min(s[k].xiao,s[r].xiao),s[k].da=max(s[k].da,s[r].da);           

   }        

   }

  void add(int now,dian kk)

  {

       for(i=0;i<2;i++)

  s[now].xy[i]=s[now].xiao[i]=s[now].da[i]=kk.xy[i];    

  }

int dis(int k)

{

    int lin=0;

for(i=0;i<2;i++)lin+=max(s[k].xiao[i]-q.xy[i],0);

for(i=0;i<2;i++)lin+=max(q.xy[i]-s[k].da[i],0);

   

    return lin;

}

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

{

    k=(l+r)>>1;xycmp=xydo;

    nth_element(a+l,a+k,a+r+1,cmp);

    add(k,a[k]);

    if(l<k)build(xia[k][0],l,k-1,xydo^1);

    if(r>k)build(xia[k][1],k+1,r,xydo^1);

    up(k);    

}

 

void ins(int k,int xydo)

{

     if(q.xy[xydo]<s[k].xy[xydo])

     {

      if(xia[k][0])ins(xia[k][0],xydo^1);

      else xia[k][0]=++n,add(n,q) ;                          

                                

     }else

     {

           if(xia[k][1])ins(xia[k][1],xydo^1);

      else xia[k][1]=++n,add(n,q) ;   

      }

     up(k);

}

    void zhao(int k)

    {

    ans=min(ans,abs(s[k].xy[1]-q.xy[1])+abs(s[k].xy[0]-q.xy[0]));

      int ld=(xia[k][0])?dis(xia[k][0]):inf;

      int rd=(xia[k][1])?dis(xia[k][1]):inf;

      if(ld<rd)

      {

      if(ld<ans)zhao(xia[k][0]);if(rd<ans)zhao(xia[k][1]);        

      }else

      {

           if(rd<ans)zhao(xia[k][1]);if(ld<ans)zhao(xia[k][0]); 

       }

    }       

}kd;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: