题意

给出n个酒店的坐标和价格,然后m个查询,每个查询给出一个人的坐标和能承受的最大价格,然后找出在他价格承受范围以内,距离他最近的宾馆,如果有多个,那么输出第一个

分析

kd树的模板题

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <cmath>
  6.  
  7. using namespace std;
  8. const int maxn=+;
  9. const int INF=;
  10.  
  11. typedef long long LL;
  12. inline int read(){
  13. int x(),f();
  14. char ch=getchar();
  15. while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
  16. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  17. return x*f;
  18. }
  19. LL ANS;
  20. struct kdNode{
  21. int x[];
  22. int div;
  23. int id;
  24. bool lef;
  25. }ans,p[maxn],q;
  26. int cmpNo;
  27. bool cmp(kdNode a,kdNode b){
  28. return a.x[cmpNo]<b.x[cmpNo];
  29. }
  30.  
  31. inline LL dis(kdNode a,kdNode b){
  32. LL res=(LL)(a.x[]-b.x[])*(a.x[]-b.x[])+(LL)(a.x[]-b.x[])*(a.x[]-b.x[]);
  33. return res;
  34. }
  35. void buildKD(int l,int r,kdNode* p,int d){
  36. if(l>r)return;
  37. int m=(l+r)/;
  38. cmpNo=d;
  39. nth_element(p+l,p+m,p+r+,cmp);
  40. p[m].div=d;
  41. // printf("%d %d %lld %lld %lld\n",l,r,p[m].x[0],p[m].x[1],p[m].x[2]);
  42. if(l==r){
  43. p[m].lef=;
  44. return;
  45. }
  46. buildKD(l,m-,p,(d+)%);
  47. buildKD(m+,r,p,(d+)%);
  48. }
  49. void findkd(int l,int r,kdNode &tar,kdNode *p){
  50. if(l>r)return ;
  51. int m=(l+r)/;
  52. LL d=dis(p[m],tar);
  53. if(p[m].lef){
  54. if(p[m].x[]<=tar.x[]){
  55. if(ANS>d||(ANS==d&&ans.id>p[m].id)){
  56. ANS=d;
  57. ans.id=p[m].id;
  58. for(int i=;i<=;i++)
  59. ans.x[i]=p[m].x[i];
  60. }
  61. }
  62. return;
  63. }
  64. int t=tar.x[p[m].div]-p[m].x[p[m].div];
  65. if(t>){
  66. findkd(m+,r,tar,p);
  67. if(p[m].x[]<=tar.x[]){
  68. if(ANS>d||(ANS==d&&p[m].id<ans.id)){
  69. ANS=d;
  70. for(int j=;j<=;j++)
  71. ans.x[j]=p[m].x[j];
  72. ans.id=p[m].id;
  73. }
  74. }
  75. if(ANS>t)
  76. findkd(l,m-,tar,p);
  77. }else{
  78. findkd(l,m-,tar,p);
  79. if(p[m].x[]<=tar.x[]){
  80. if(ANS>d||(ANS==d&&p[m].id<ans.id)){
  81. ANS=d;
  82. for(int j=;j<=;j++)
  83. ans.x[j]=p[m].x[j];
  84. ans.id=p[m].id;
  85. }
  86. }
  87. if(ANS>-t)
  88. findkd(m+,r,tar,p);
  89. }
  90. }
  91.  
  92. int T,n,m;
  93. int main(){
  94. T=read();
  95. for(int kas=;kas<=T;kas++){
  96. // scanf("%d%d",&n,&m);
  97. n=read(),m=read();
  98. for(int i=;i<n;i++){
  99. //scanf("%d%d%d",&p[i].x[0],&p[i].x[1],&p[i].x[2]);
  100. p[i].x[]=read();p[i].x[]=read();p[i].x[]=read();
  101. p[i].lef=;
  102. p[i].id=i;
  103. // printf("%lld %lld %lld ",p[i].x[0],p[i].x[1],p[i].x[2]);
  104. }
  105. buildKD(,n-,p,);
  106. for(int i=;i<=m;i++){
  107. ANS=INF;
  108. //scanf("%d%d%d",&q.x[0],&q.x[1],&q.x[2]);
  109. q.x[]=read();q.x[]=read();q.x[]=read();
  110. findkd(,n-,q,p);
  111. printf("%d %d %d\n",ans.x[],ans.x[],ans.x[]);
  112. }
  113. }
  114. return ;
  115. }

【HDU5992】Finding Hotels 【KD树】的更多相关文章

  1. HDU5992 - Finding Hotels

    原题链接 Description 给出个二维平面上的点,每个点有权值.次询问,求所有权值小于等于的点中,距离坐标的欧几里得距离最小的点.如果有多个满足条件的点,输出最靠前的一个. Solution 拿 ...

  2. hdu-5992 Finding Hotels(kd-tree)

    题目链接: Finding Hotels Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 102400/102400 K (Java/ ...

  3. 【kd-tree】hdu5992 Finding Hotels

    比较裸的kd-tree,但是比较考验剪枝. 貌似除了经典的矩形距离剪枝之外, 还必须加个剪枝是某个矩形内的最小价格如果大于价格限制的话,则剪枝. #include<cstdio> #inc ...

  4. 2016 ICPC青岛站---k题 Finding Hotels(K-D树)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5992 Problem Description There are N hotels all over ...

  5. HDU 5992 Finding Hotels(KD树)题解

    题意:n家旅店,每个旅店都有坐标x,y,每晚价钱z,m个客人,坐标x,y,钱c,问你每个客人最近且能住进去(非花最少钱)的旅店,一样近的选排名靠前的. 思路:KD树模板题 代码: #include&l ...

  6. 利用KD树进行异常检测

    软件安全课程的一次实验,整理之后发出来共享. 什么是KD树 要说KD树,我们得先说一下什么是KNN算法. KNN是k-NearestNeighbor的简称,原理很简单:当你有一堆已经标注好的数据时,你 ...

  7. kd树和knn算法的c语言实现

    基于kd树的knn的实现原理可以参考文末的链接,都是一些好文章. 这里参考了别人的代码.用c语言写的包括kd树的构建与查找k近邻的程序. code: #include<stdio.h> # ...

  8. PCL点云库:Kd树

    Kd树按空间划分生成叶子节点,各个叶子节点里存放点数据,其可以按半径搜索或邻区搜索.PCL中的Kd tree的基础数据结构使用了FLANN以便可以快速的进行邻区搜索.FLANN is a librar ...

  9. KNN算法与Kd树

    最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知 ...

随机推荐

  1. zTree简单使用

    zTree使用 zTree github地址 zTree API文档 zTree插件依赖JQ所以使用zTree首先引入JQ,另外zTree的点击功能,编辑功能都是单独的文件,如需使用也要引入(也可以引 ...

  2. 201621123005《Java程序设计》实验总结

    201621123005<Java程序设计>第七次实验总结 1. 本周学习总结 1.1 思维导图:Java图形界面总结 2.书面作业 1. GUI中的事件处理 1.1 写出事件处理模型中最 ...

  3. 《转》深入理解Activity启动流程(三)–Activity启动的详细流程1

    本文原创作者:Cloud Chou. 出处:本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 深入理解Activity启动流程(一)--Activity启 ...

  4. L178 smart meter watchdog

    There is "no realistic prospect" of the government meeting its own deadline to install sma ...

  5. Oracle 分析函数及常用函数

    什么叫分析函数(Analytic function)? Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是 对于每个组返回多行,而聚合函数对于每个组 ...

  6. IE、Chrome、Firefox 三大浏览器对比

    1. 代理 IE 浏览器设置代理位置在: [Internet 选项]⇒ [连接]选项卡 ⇒ [局域网设置],如下: Chrome 的代理配置界面完全同 IE,只是你设置路径在: [设置]⇒ [高级]⇒ ...

  7. 【转】嵌入式Linux文件系统启动脚本及分析

    原文网址:http://www.linuxidc.com/Linux/2011-03/33728.htm 在内核初始化完成后,嵌入式linux 文件系统的启动过程主要包含以下几个步骤: 1. 执行/s ...

  8. DNS记录类型名单

    原文:http://www.worldlingo.com/ma/enwiki/zh_cn/List_of_DNS_record_types DNS记录类型名单 这 DNS记录类型名单 提供一个方便索引 ...

  9. PHP安全性漫谈

    最近刚做完两个PHP的网站项目,客户虽然没有安全性的相关需求,但是自己不能放过对自己的要求,何况对以后做电子商务的项目相当有帮助,呵呵,早准备早超生,经过查看PHP 帮助和相关资料~~~~       ...

  10. CF 914G Sum the Fibonacci——子集卷积

    题目:http://codeforces.com/contest/914/problem/G 第一个括号可以子集卷积:第三个括号可以用 FWT 异或卷积:这样算出选两个数组成 x 的方案数:三个部分的 ...