zoukankan      html  css  js  c++  java
  • hdu4347The Closest M Points kdtree

    kdtree讲解:

    https://blog.csdn.net/qing101hua/article/details/53228668

    https://blog.csdn.net/acdreamers/article/details/44664645

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4347

    给你一堆点,每次查询给一个点求和这个点最近的m个点是什么(距离是欧氏距离)

    裸的kdtree

    //#pragma comment(linker, "/stack:200000000")
    //#pragma GCC optimize("Ofast,no-stack-protector")
    //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
    //#pragma GCC optimize("unroll-loops")
    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pi acos(-1.0)
    #define ll long long
    #define vi vector<int>
    #define mod 1000000007
    #define C 0.5772156649
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #define pil pair<int,ll>
    #define pli pair<ll,int>
    #define pii pair<int,int>
    #define cd complex<double>
    #define ull unsigned long long
    #define base 1000000000000000000
    #define fio ios::sync_with_stdio(false);cin.tie(0)
    
    using namespace std;
    
    const double g=10.0,eps=1e-8;
    const int N=50000+10,maxn=5000+10,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f;
    
    int n,k,idx;
    struct node{
        int f[5];
        bool operator <(const node&rhs)const{
            return f[idx]<rhs.f[idx];
        }
    }a[N];
    priority_queue<pair<double,node> >q;
    struct kdtree{
        bool vis[N<<2];
        node date[N<<2];
        void build(int l,int r,int rt,int dep)
        {
            if(l>r)return ;
            vis[rt]=1;
            vis[rt<<1]=vis[rt<<1|1]=0;
            idx=dep%k;
            int m=(l+r)>>1;
            nth_element(a+l,a+m,a+r+1);
            date[rt]=a[m];
            build(l,m-1,rt<<1,dep+1);
            build(m+1,r,rt<<1|1,dep+1);
        }
        void query(node p,int m,int rt,int dep)
        {
            if(!vis[rt])return ;
            printf("%d 
    ",rt);
            pair<double,node>cur(0,date[rt]);
            for(int i=0;i<k;i++)
                cur.fi+=(cur.se.f[i]-p.f[i])*(cur.se.f[i]-p.f[i]);
            int dim=dep%k;
            bool fg=0;
            int x=rt<<1,y=rt<<1|1;
            if(p.f[dim]>=date[rt].f[dim])swap(x,y);
            if(vis[x])query(p,m,x,dep+1);
            if(q.size()<m)q.push(cur),fg=1;
            else
            {
                if(cur.fi<q.top().fi)
                {
                    q.pop();q.push(cur);
                }
                if((p.f[dim]-date[rt].f[dim])*(p.f[dim]-date[rt].f[dim])<q.top().fi)fg=1;
            }
            if(vis[y]&&fg)query(p,m,y,dep+1);
        }
    }kd;
    int main()
    {
        while(scanf("%d%d",&n,&k)!=EOF)
        {
            for(int i=0;i<n;i++)
                for(int j=0;j<k;j++)
                    scanf("%d",&a[i].f[j]);
            kd.build(0,n-1,1,0);
            int t;scanf("%d",&t);
            while(t--)
            {
                node p;
                for(int i=0;i<k;i++)scanf("%d",&p.f[i]);
                int m;scanf("%d",&m);
                while(!q.empty())q.pop();
    //            printf("%d
    ",idx);
                kd.query(p,m,1,0);
                printf("the closest %d points are:
    ",m);
                node ans[25];
                for(int i=0;!q.empty();i++)ans[i]=q.top().se,q.pop();
                for(int i=m-1;i>=0;i--)
                    for(int j=0;j<k;j++)
                        printf("%d%c",ans[i].f[j],j==k-1?'
    ':' ');
            }
        }
        return 0;
    }
    /***********************
    
    ***********************/
    View Code
  • 相关阅读:
    二维hash(Uva 12886)
    C#中的线程(一)入门
    全国各地所有高校名单数据库 全国所有高校排名
    协议与代理
    表的约束条件
    na 斐波那契数列f(f(n))
    gcd题目
    Neighbor 隔壁
    hadoop
    Mybatis中实现mysql分页写法!!注意
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/8984540.html
Copyright © 2011-2022 走看看