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

题目链接:https://www.nowcoder.com/acm/contest/207/K

Problem Description
There are N hotels all over the world. Each hotel has a location and a price. M guests want to find a hotel with an acceptable price and a minimum distance from their locations. The distances are measured in Euclidean metric.

Input
The first line is the number of test cases. For each test case, the first line contains two integers N (N ≤ 200000) and M (M ≤ 20000). Each of the following N lines describes a hotel with 3 integers x (1 ≤ x ≤ N), y (1 ≤ y ≤ N) and c (1 ≤ c ≤ N), in which x and y are the coordinates of the hotel, c is its price. It is guaranteed that each of the N hotels has distinct x, distinct y, and distinct c. Then each of the following M lines describes the query of a guest with 3 integers x (1 ≤ x ≤ N), y (1 ≤ y ≤ N) and c (1 ≤ c ≤ N), in which x and y are the coordinates of the guest, c is the maximum acceptable price of the guest.

Output
For each guests query, output the hotel that the price is acceptable and is nearest to the guests location. If there are multiple hotels with acceptable prices and minimum distances, output the first one.

Sample Input
2
3 3
1 1 1
3 2 3
2 3 2
2 2 1
2 2 2
2 2 3
5 5
1 4 4
2 1 2
4 5 3
5 2 1
3 3 5
3 3 1
3 3 2
3 3 3
3 3 4
3 3 5

Sample Output
1 1 1
2 3 2
3 2 3
5 2 1
2 1 2
2 1 2
1 4 4
3 3 5

题意:

给出 $N$ 个酒店,每个酒店有坐标 $(x,y)$,价格为 $c$;同时又给出 $M$ 个人,同样每个人都有坐标 $(x,y)$,每个人能接收的最高酒店价格为 $c$;

每个人会选择不高于自己可接受价格的酒店中最近的那一个,如果同时有多个酒店同样最近,选择编号的那一个。

题解:

根据题目里的费用要求和同距离输出编号最小酒店两个要求,对KDTree模板进行一点小修改即可。

AC代码:

#include<bits/stdc++.h>
using namespace std; const int maxn=2e5+;
const int maxdim=; namespace KDTree
{
int K;//维数
inline double sqr(double x){return x*x;}
struct Point
{
int x[maxdim];
int c;
int idx;
double distance(const Point &oth)const
{
double ret=;
for(int i=;i<K;i++) ret+=sqr(x[i]-oth.x[i]);
return ret;
}
void input(int _idx)
{
idx=_idx;
for(int i=;i<K;i++) scanf("%d",&x[i]);
scanf("%d",&c);
}
void output()
{
for(int i=;i<K;i++) printf("%d ",x[i]);
printf("%d\n",c);
}
};
struct cmpx
{
int div;
cmpx(const int &_div){div=_div;}
bool operator()(const Point &a,const Point &b)
{
for(int i=;i<K;i++)
{
int k=(div+i)%K;
if(a.x[k]!=b.x[k]) return a.x[k]<b.x[k];
}
return true;
}
};
inline bool cmp(const Point &a,const Point &b,int div)
{
cmpx cp=cmpx(div);
return cp(a,b);
} struct Node //KDTree的节点
{
Point e;
Node *lc,*rc;
int div;
}pool[maxn],*tail,*root;
void init(){tail=pool;} //初始化KDTree
Node* Build(Point *a,int l,int r,int div) //建树
{
if(l>=r) return NULL;
Node *p=tail++;
p->div=div;
int mid=(l+r)/;
nth_element(a+l,a+mid,a+r,cmpx(div));
p->e=a[mid];
p->lc=Build(a,l,mid,(div+)%K);
p->rc=Build(a,mid+,r,(div+)%K);
return p;
} struct Qnode
{
Point p;
double dist;
Qnode(){}
Qnode(Point _p,double _dist){p=_p; dist=_dist;}
bool operator <(const Qnode &oth)const{return dist<oth.dist;}
};
priority_queue<Qnode> Q;
void Search(const Point &p,Node *now,int div,int m) //在now节点子树下搜索p点的m近邻
{
if(now==NULL) return;
if(cmp(p,now->e,div))
{
Search(p,now->lc,(div+)%K,m);
if(Q.size()<m)
{
if(now->e.c <= p.c) Q.push(Qnode(now->e,p.distance(now->e)));
Search(p,now->rc,(div+)%K,m);
}
else
{
if(p.distance(now->e) < Q.top().dist || (p.distance(now->e) == Q.top().dist && now->e.idx < Q.top().p.idx))
{
if(now->e.c <= p.c)
{
Q.pop();
Q.push(Qnode(now->e,p.distance(now->e)));
}
}
if(sqr((now->e.x[div])-(p.x[div])) < Q.top().dist) Search(p,now->rc,(div+)%K,m);
}
}
else
{
Search(p,now->rc,(div+)%K,m);
if(Q.size()<m)
{
if(now->e.c <= p.c) Q.push(Qnode(now->e,p.distance(now->e)));
Search(p,now->lc,(div+)%K,m);
}
else
{
if(p.distance(now->e) < Q.top().dist || (p.distance(now->e) == Q.top().dist && now->e.idx < Q.top().p.idx))
{
if(now->e.c <= p.c)
{
Q.pop();
Q.push(Qnode(now->e,p.distance(now->e)));
}
}
if(sqr((now->e.x[div])-(p.x[div])) < Q.top().dist) Search(p,now->lc,(div+)%K,m);
}
}
} void Search(const Point &p,int m) //搜索p点的m近邻
{
while(!Q.empty()) Q.pop();
Search(p,root,,m);
}
}; int n,m;
KDTree::Point p[maxn]; int main()
{
KDTree::K=;
int T;
cin>>T;
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=;i<n;i++) p[i].input(i);
KDTree::init();
KDTree::root=KDTree::Build(p,,n,); KDTree::Point o;
for(int i=;i<=m;i++)
{
o.input(i);
KDTree::Search(o,);
o=KDTree::Q.top().p;
o.output();
}
}
}

PS.由于只需要最近邻,所以其实并不需要那个优先队列,只不过懒得改了。

HDU 5992/nowcoder 207K - Finding Hotels - [KDTree]的更多相关文章

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

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

  2. Hdu-5992 2016ACM/ICPC亚洲区青岛站 K.Finding Hotels KDtree

    题面 题意:二维平面上有很多点,每个点有个权值,现在给你一个点(很多组),权值v,让你找到权值小于等于v的点中离这个点最近的,相同的输出id小的 题解:很裸的KDtree,但是查询的时候有2个小限制, ...

  3. Finding Hotels

    Finding Hotels http://acm.hdu.edu.cn/showproblem.php?pid=5992 Time Limit: 2000/1000 MS (Java/Others) ...

  4. HDU5992 - Finding Hotels

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

  5. 【22.95%】【hdu 5992】Finding Hotels

    Problem Description There are N hotels all over the world. Each hotel has a location and a price. M ...

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

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

  7. 【kd-tree】hdu5992 Finding Hotels

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

  8. HDU 5992 kd-tree

    还记得青岛的时候和蕾姐讨论了近三个小时也不知道这是什么东西 后来发现是kdtree 于是拖到寒假才补这个算法 写完几道模板题发现多维的kdtree查找最近也是很简单的拓展 于是很快1A了这道题 它真的 ...

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

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

随机推荐

  1. Web前端,HTML5开发,前端资源,前端网址,前端博客,前端框架整理 - 转改

    Web前端/H5开发,前端资源,前端网址,前端博客,前端框架整理 综合类 前端知识体系 前端知识结构 Web前端开发大系概览 Web前端开发大系概览-中文版 Web Front-end Stack v ...

  2. Chrome F12 温故而知新 :因为重定向导致清空Network信息

    虽然我以前都是用Fiddler 4来作为解决方案.但实际上可以勾选 [Preserve log]来保存日志 这样就不担心因为页面重定向导致清空了日志了

  3. 《网络编程》IPv4 与 IPv6 相互操作

    前言 因为互联网终端不断添加.IPv4 地址长度(32位)已不可以满足要求.所以出现了 IPv6地址(128位).可是现有应用程序大部分还是採用 IPv4 地址形式,所以必须解决 IPv4 与 IPv ...

  4. FFmpeg: AVFormatContext 结构体分析

    AVFormatContext 结构体分析这个结构体描述了一个媒体文件或媒体流的构成和基本信息.这是FFMpeg中最为基本的一个结构,是其他所有结构的根,是一个多媒体文件或流的根本抽象.主要成员释义: ...

  5. [APM] 解读2016之APM国内篇:快速增长的APM市场和技术

    前言 2016年是APM技术和市场快速发展的一年,在这一年里APM市场特别是国内的市场取得了极大的增长,用户对APM价值的认识和接受度也有了很大的提升,国内市场已基本完成了用户教育和市场培养的阶段.与 ...

  6. c++命名空间---namespace

    C++ 命名空间 C++ 应用程序中.例如,您可能会写一个名为 func() 的函数,在另一个可用的库中也存在一个相同的函数 func().这样,编译器就无法判断您所使用的是哪一个 func() 函数 ...

  7. Oracle同一个用户下启动多个数据库实例

     oracle@yingxiang-testServer1 oradata]$ export ORACLE_SID=APPDB[oracle@yingxiang-testServer1 oradata ...

  8. 推荐几个Windows工具软件: ASuite - 便携的程序启动器

    主页: http://asuite.sourceforge.net 下载: http://sourceforge.net/projects/asuite/ ASuite is a lightweigh ...

  9. Java知多少(43)异常处理基础

    Java异常是一个描述在代码段中发生的异常(也就是出错)情况的对象.当异常情况发生,一个代表该异常的对象被创建并且在导致该错误的方法中被抛出(throw).该方法可以选择自己处理异常或传递该异常.两种 ...

  10. Login failed for user 'IIS APPPOOL\ASP.NET v4.0'

    Looks like it's failing trying to open a connection to SQL Server. You need to add a login to SQL Se ...