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;
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;