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

  1. //#pragma comment(linker, "/stack:200000000")
  2. //#pragma GCC optimize("Ofast,no-stack-protector")
  3. //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  4. //#pragma GCC optimize("unroll-loops")
  5. #include<bits/stdc++.h>
  6. #define fi first
  7. #define se second
  8. #define mp make_pair
  9. #define pb push_back
  10. #define pi acos(-1.0)
  11. #define ll long long
  12. #define vi vector<int>
  13. #define mod 1000000007
  14. #define C 0.5772156649
  15. #define ls l,m,rt<<1
  16. #define rs m+1,r,rt<<1|1
  17. #define pil pair<int,ll>
  18. #define pli pair<ll,int>
  19. #define pii pair<int,int>
  20. #define cd complex<double>
  21. #define ull unsigned long long
  22. #define base 1000000000000000000
  23. #define fio ios::sync_with_stdio(false);cin.tie(0)
  24.  
  25. using namespace std;
  26.  
  27. const double g=10.0,eps=1e-;
  28. const int N=+,maxn=+,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f;
  29.  
  30. int n,k,idx;
  31. struct node{
  32. int f[];
  33. bool operator <(const node&rhs)const{
  34. return f[idx]<rhs.f[idx];
  35. }
  36. }a[N];
  37. priority_queue<pair<double,node> >q;
  38. struct kdtree{
  39. bool vis[N<<];
  40. node date[N<<];
  41. void build(int l,int r,int rt,int dep)
  42. {
  43. if(l>r)return ;
  44. vis[rt]=;
  45. vis[rt<<]=vis[rt<<|]=;
  46. idx=dep%k;
  47. int m=(l+r)>>;
  48. nth_element(a+l,a+m,a+r+);
  49. date[rt]=a[m];
  50. build(l,m-,rt<<,dep+);
  51. build(m+,r,rt<<|,dep+);
  52. }
  53. void query(node p,int m,int rt,int dep)
  54. {
  55. if(!vis[rt])return ;
  56. printf("%d \n",rt);
  57. pair<double,node>cur(,date[rt]);
  58. for(int i=;i<k;i++)
  59. cur.fi+=(cur.se.f[i]-p.f[i])*(cur.se.f[i]-p.f[i]);
  60. int dim=dep%k;
  61. bool fg=;
  62. int x=rt<<,y=rt<<|;
  63. if(p.f[dim]>=date[rt].f[dim])swap(x,y);
  64. if(vis[x])query(p,m,x,dep+);
  65. if(q.size()<m)q.push(cur),fg=;
  66. else
  67. {
  68. if(cur.fi<q.top().fi)
  69. {
  70. q.pop();q.push(cur);
  71. }
  72. if((p.f[dim]-date[rt].f[dim])*(p.f[dim]-date[rt].f[dim])<q.top().fi)fg=;
  73. }
  74. if(vis[y]&&fg)query(p,m,y,dep+);
  75. }
  76. }kd;
  77. int main()
  78. {
  79. while(scanf("%d%d",&n,&k)!=EOF)
  80. {
  81. for(int i=;i<n;i++)
  82. for(int j=;j<k;j++)
  83. scanf("%d",&a[i].f[j]);
  84. kd.build(,n-,,);
  85. int t;scanf("%d",&t);
  86. while(t--)
  87. {
  88. node p;
  89. for(int i=;i<k;i++)scanf("%d",&p.f[i]);
  90. int m;scanf("%d",&m);
  91. while(!q.empty())q.pop();
  92. // printf("%d\n",idx);
  93. kd.query(p,m,,);
  94. printf("the closest %d points are:\n",m);
  95. node ans[];
  96. for(int i=;!q.empty();i++)ans[i]=q.top().se,q.pop();
  97. for(int i=m-;i>=;i--)
  98. for(int j=;j<k;j++)
  99. printf("%d%c",ans[i].f[j],j==k-?'\n':' ');
  100. }
  101. }
  102. return ;
  103. }
  104. /***********************
  105.  
  106. ***********************/

hdu4347The Closest M Points kdtree的更多相关文章

  1. HDU 4347 - The Closest M Points - [KDTree模板题]

    本文参考: https://www.cnblogs.com/GerynOhenz/p/8727415.html kuangbin的ACM模板(新) 题目链接:http://acm.hdu.edu.cn ...

  2. hud 4347 The Closest M Points(KD-Tree)

    传送门 解题思路 \(KD-Tree\)模板题,\(KD-Tree\)解决的是多维问题,它是一个可以储存\(K\)维数据的二叉树,每一层都被一维所分割.它的插入删除复杂度为\(log^2 n\),它查 ...

  3. 【BZOJ】3053: The Closest M Points(kdtree)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3053 本来是1a的QAQ.... 没看到有多组数据啊.....斯巴达!!!!!!!!!!!!!!!! ...

  4. [hdu4347]The Closest M Points(线段树形式kd-tree)

    解题关键:kdtree模板题,距离某点最近的m个点. #include<cstdio> #include<cstring> #include<algorithm> ...

  5. HDU 4347 The Closest M Points (kdTree)

    赤果果的kdTree. 学习传送门:http://www.cnblogs.com/v-July-v/archive/2012/11/20/3125419.html 其实就是二叉树的变形 #includ ...

  6. bzoj 3053: The Closest M Points【KD-tree】

    多维KDtree板子 左右儿子的估价用mn~mx当区间,假设区间里的数都存在:k维轮着做割点 #include<iostream> #include<cstdio> #incl ...

  7. 【kd-tree】bzoj3053 The Closest M Points

    同p2626.由于K比较小,所以不必用堆. #include<cstdio> #include<cstring> #include<cmath> #include& ...

  8. [hdu4347]The Closest M Points(平衡树式kdtree)

    解题关键:模板题(结合起来了) #include<iostream> #include<cstdio> #include<cstring> #include< ...

  9. 【BZOJ 3053】The Closest M Points

    KDTree模板,在m维空间中找最近的k个点,用的是欧几里德距离. 理解了好久,昨晚始终不明白那些“估价函数”,后来才知道分情况讨论,≤k还是=k,在当前这一维度距离过线还是不过线,过线则要继续搜索另 ...

随机推荐

  1. 小程序页面链接-navigator(导航)

    navigator-页面链接-通过设置open-type的值来确定页面的打开方式. <view class="btn-area"> <navigator url= ...

  2. 在MFC下面实际演示CCriticalSection 的使用

    Q:CCriticalSection是什么? A:CCriticalSection是一种线程同步策略 或者说技术 或者方法  总之呢就是这么个意思.... 参考资料: http://blog.csdn ...

  3. delphi webbrowser 跨域访问

    procedure IterateFrames(const AWB: IWebBrowser2);var Doc: IHTMLDocument2; Container: IOleContainer; ...

  4. WEB前端研发工程师编程能力成长之路(2)

    四.[入微] 最强解决方案.你能够走在需求的前面,将当前需求里有的.没有直接提出来的.现在暂时没有但将来可能有的等等,及前端编程潜规则等各个方方面面都综合考虑,给出最优方案.以一招胜万招. var s ...

  5. [笔记] Ubuntu 18.04源码编译安装OpenCV 4.0流程

    标准常规安装方法安装的OpenCV版本比较低,想尝鲜使用4.0版本,只好源码安装. 安装环境 OS:Ubuntu 18.04 64 bit 显卡:NVidia GTX 1080 CUDA:10.0 c ...

  6. AtCoder Regular Contest 080 D - Grid Coloring

    地址:http://arc080.contest.atcoder.jp/tasks/arc080_b 题目: D - Grid Coloring Time limit : 2sec / Memory ...

  7. [转]loadrunner:系统的平均并发用户数和并发数峰值如何估算

    一.经典公式1: 一般来说,利用以下经验公式进行估算系统的平均并发用户数和峰值数据 1)平均并发用户数为 C = nL/T 2)并发用户数峰值 C‘ = C + 3*根号C C是平均并发用户数,n是l ...

  8. 本地多张图片采用jmeter上传到ftp服务器的方法和获取服务器日志中某些关键字的基本方法

    测试需求: 本地图片上传到ftp服务器里和另外两台不同算法比对服务器进行比对,得出漏检和误检结果:这实际属于功能测试范畴. 测试思路: 第一种方法:使用实际场景的摄像机抓拍图片上传到服务器,用录屏软件 ...

  9. GRUB2 分析 (三)

    接上一篇 从地址0x8200开始的是lzma_decompress.img.这是由startup_raw.S编译生成的.这个文件稍微复杂点.首先一开始就是个跳转指令: ljmp $0, $ABS(LO ...

  10. 20145216史婧瑶《Java程序设计》第四次实验报告

    实验四 Android环境搭建 实验内容 搭建Android环境 运行Android 修改代码,能输出学号 实验步骤 1.搭建Android环境 2.安装Android,核心是配置JDK.SDK 3. ...