KD-Tree

  • 题目:Hdu4347
  • 题意:在D维空间中,求离某点最近的K个点
  • 题解:KD Tree
  • 代码:

#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
        
        
#include 
        
        
          #include 
         
           using namespace std; #define LL long long int #define maxDim 5 #define maxN 50000 #define maxNeed 10 #define inf int dim; struct kdNode{ LL x[maxDim]; bool leaf; int div; kdNode(){} void read(){ for(int i=0; i 
          
            qq; inline void pqClear(){ while(!qq.empty()){ qq.pop(); } } void buildKd(int l, int r, int _div=dim-1){ if(l>r){ return; } int mid=(l+r)>>1; cmpDim=_div; nth_element(p+l, p+mid, p+r+1, cmp); p[mid].div=_div; if(l==r){ p[mid].leaf=true; return; } buildKd(l, mid-1, (_div+1)%dim); buildKd(mid+1, r, (_div+1)%dim); } int needNum, curNum; LL maxDis; void findKd(int l, int r){ if(l>r){ return; } int mid=(l+r)>>1; LL curDis=dist(p[mid], tar); if(p[mid].leaf){ if(curNum 
           
             0){//在右边 findKd(mid+1, r); if(curNum < needNum){ qq.push(node(p[mid], curDis)); ++curNum; maxDis=qq.top().dis; findKd(l, mid-1); } else{ if(curDis 
            
              =0; --i){ Ans[i].write(); } } } return 0; } /* 3 2 1 1 1 3 3 4 2 2 3 2 2 3 1 */ 
             
            
           
          
        
       
       
      
      
     
     
    
    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值