Hdu 5992 KD-Tree

2016 ICPC Qingdao K

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF=1ll<<60;
struct node{
    int d[3],ma[3],mi[3],l,r,id;
}T[200003];
int rt,n,m,cmp_d;
inline bool cmp(node a,node b){
    return a.d[cmp_d]<b.d[cmp_d];
}
inline void up(int u,int v){
    T[u].ma[0]=max(T[u].ma[0],T[v].ma[0]);
    T[u].ma[1]=max(T[u].ma[1],T[v].ma[1]);
    T[u].ma[2]=max(T[u].ma[2],T[v].ma[2]);
    T[u].mi[0]=min(T[u].mi[0],T[v].mi[0]);
    T[u].mi[1]=min(T[u].mi[1],T[v].mi[1]);
    T[u].mi[2]=min(T[u].mi[2],T[v].mi[2]);
}
inline int build(int l,int r,int D){
    int mid=(l+r)>>1;
    cmp_d=D;
    nth_element(T+l,T+mid,T+r+1,cmp);
    T[mid].ma[0]=T[mid].mi[0]=T[mid].d[0];
    T[mid].ma[1]=T[mid].mi[1]=T[mid].d[1];
    T[mid].ma[2]=T[mid].mi[2]=T[mid].d[2];

    if(l!=mid){
        T[mid].l=build(l,mid-1,(D+1)%3);
        up(mid,T[mid].l);
    }
    if(r!=mid){
        T[mid].r=build(mid+1,r,(D+1)%3);
        up(mid,T[mid].r);
    }
    return mid;
}

ll dis;
int ans;
int x,y,c;
//估计范围
inline ll getdis(int p){
    ll ret=0;
    if(T[p].mi[2]>c)return INF;
    if(x>T[p].ma[0])ret+=1ll*(x-T[p].ma[0])*(x-T[p].ma[0]);
    if(x<T[p].mi[0])ret+=1ll*(T[p].mi[0]-x)*(T[p].mi[0]-x);
    if(y>T[p].ma[1])ret+=1ll*(y-T[p].ma[1])*(y-T[p].ma[1]);
    if(y<T[p].mi[1])ret+=1ll*(T[p].mi[1]-y)*(T[p].mi[1]-y);
    return ret;
}
inline void query(int p){
    ll d0=1ll*(x-T[p].d[0])*(x-T[p].d[0])+1ll*(y-T[p].d[1])*(y-T[p].d[1]);
    if(T[p].d[2]>c)d0=INF;
    if(d0<dis||(d0==dis&&T[p].id<T[ans].id)){
        dis=d0;
        ans=p;
    }
    ll dl=INF,dr=INF;
    if(T[p].l)dl=getdis(T[p].l);
    if(T[p].r)dr=getdis(T[p].r);
    if(dl<dr){
        if(dl<=dis)query(T[p].l);
        if(dr<=dis)query(T[p].r);
    }
    else {
        if(dr<=dis)query(T[p].r);
        if(dl<=dis)query(T[p].l);
    }
}
int main(){
    int tt;
    scanf("%d",&tt);
    while(tt--){
        memset(T,0,sizeof(T));
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            scanf("%d%d%d",&T[i].d[0],&T[i].d[1],&T[i].d[2]);
            T[i].id=i;
        }
        rt=build(1,n,0);
        for(int i=1;i<=m;i++){
            scanf("%d%d%d",&x,&y,&c);
            ans=0;
            dis=INF;
            query(rt);
            printf("%d %d %d\n",T[ans].d[0],T[ans].d[1],T[ans].d[2]);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/MrBird_to_fly/article/details/80869467