题意

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

分析

kd树的模板题

     #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath> using namespace std;
const int maxn=+;
const int INF=; typedef long long LL;
inline int read(){
int x(),f();
char ch=getchar();
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x*f;
}
LL ANS;
struct kdNode{
int x[];
int div;
int id;
bool lef;
}ans,p[maxn],q;
int cmpNo;
bool cmp(kdNode a,kdNode b){
return a.x[cmpNo]<b.x[cmpNo];
} inline LL dis(kdNode a,kdNode b){
LL res=(LL)(a.x[]-b.x[])*(a.x[]-b.x[])+(LL)(a.x[]-b.x[])*(a.x[]-b.x[]);
return res;
}
void buildKD(int l,int r,kdNode* p,int d){
if(l>r)return;
int m=(l+r)/;
cmpNo=d;
nth_element(p+l,p+m,p+r+,cmp);
p[m].div=d;
// printf("%d %d %lld %lld %lld\n",l,r,p[m].x[0],p[m].x[1],p[m].x[2]);
if(l==r){
p[m].lef=;
return;
}
buildKD(l,m-,p,(d+)%);
buildKD(m+,r,p,(d+)%);
}
void findkd(int l,int r,kdNode &tar,kdNode *p){
if(l>r)return ;
int m=(l+r)/;
LL d=dis(p[m],tar);
if(p[m].lef){
if(p[m].x[]<=tar.x[]){
if(ANS>d||(ANS==d&&ans.id>p[m].id)){
ANS=d;
ans.id=p[m].id;
for(int i=;i<=;i++)
ans.x[i]=p[m].x[i];
}
}
return;
}
int t=tar.x[p[m].div]-p[m].x[p[m].div];
if(t>){
findkd(m+,r,tar,p);
if(p[m].x[]<=tar.x[]){
if(ANS>d||(ANS==d&&p[m].id<ans.id)){
ANS=d;
for(int j=;j<=;j++)
ans.x[j]=p[m].x[j];
ans.id=p[m].id;
}
}
if(ANS>t)
findkd(l,m-,tar,p);
}else{
findkd(l,m-,tar,p);
if(p[m].x[]<=tar.x[]){
if(ANS>d||(ANS==d&&p[m].id<ans.id)){
ANS=d;
for(int j=;j<=;j++)
ans.x[j]=p[m].x[j];
ans.id=p[m].id;
}
}
if(ANS>-t)
findkd(m+,r,tar,p);
}
} int T,n,m;
int main(){
T=read();
for(int kas=;kas<=T;kas++){
// scanf("%d%d",&n,&m);
n=read(),m=read();
for(int i=;i<n;i++){
//scanf("%d%d%d",&p[i].x[0],&p[i].x[1],&p[i].x[2]);
p[i].x[]=read();p[i].x[]=read();p[i].x[]=read();
p[i].lef=;
p[i].id=i;
// printf("%lld %lld %lld ",p[i].x[0],p[i].x[1],p[i].x[2]);
}
buildKD(,n-,p,);
for(int i=;i<=m;i++){
ANS=INF;
//scanf("%d%d%d",&q.x[0],&q.x[1],&q.x[2]);
q.x[]=read();q.x[]=read();q.x[]=read();
findkd(,n-,q,p);
printf("%d %d %d\n",ans.x[],ans.x[],ans.x[]);
}
}
return ;
}

【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. (转)Web系统大规模并发——电商秒杀与抢购

    电商的秒杀和抢购,对我们来说,都不是一个陌生的东西.然而,从技术的角度来说,这对于Web系统是一个巨大的考验.当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要.这次我们 ...

  2. Winform菜单之Menustrip

    有窗体必定有菜单了,可以直接使用菜单组件,也可以使用按钮(按钮就没法显示级联菜单的形式了). 下面重点介绍一下各种菜单 1.Menustrip 最常用的莫过于此菜单了,从工具栏中拖入一个menustr ...

  3. HDU 1198

    http://acm.hdu.edu.cn/showproblem.php?pid=1198 裸并查集,主要工作在根据题目给出关系构图 #include <iostream> #inclu ...

  4. hibernate之xml映射文件关系维护,懒加载,级联

    一:关系维护 --->inverse默认值false,表示不放弃关系的维护.   --->inverse="true"配置在那一端,表示那一端xml对应的po放弃关系的 ...

  5. C# 能否获取一个对象所占内存的大小?

    今日,在项目重构的时候忽然想到一个问题,一个类哪些成员的增加,会影响一个类所占内存的大小?C#有没有办法知道一个对象占多少内存呢? 第一个问题:很快想到是类的非静态的字段.属性. 第二个问题:首先想到 ...

  6. 使用_beginThreadex创建多线程(C语言版多线程)

    _beginThreadex创建多线程解读 一.需要的头文件支持 #include <process.h>         // for _beginthread() 需要的设置:Proj ...

  7. oracle 查版本号

    oracle是强大的数据库,我们怎样看它的版本呢? 工具/原料 oracle 数据库, sqlplus 方法/步骤 首先进入sqlplus,cmd---plsql,登陆我们的用户,如:user/pas ...

  8. Hive之 hive架构

    Hive架构图 主要分为以下几个部分: 用户接口,包括 命令行CLI,Client,Web界面WUI,JDBC/ODBC接口等 中间件:包括thrift接口和JDBC/ODBC的服务端,用于整合Hiv ...

  9. C# zedgraph 怎么设置初始时坐标轴的比例??

    http://bbs.csdn.net/topics/390872329 已解决,,,我问是刷新图用的,,我以为mypane.YAxis.Scale.Min=0; mypane.YAxis.Scale ...

  10. GNU Radio: 射频子板

    本文简要介绍 USRP 配套的子板参数信息. 射频子板WBX-40 性能特点 频率覆盖:50 MHz – 2.2GHz 最大信号处理带宽:40MHz 行为描述 WBX-40提供高宽带收发器,可提供高达 ...