题目链接: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. Appium 输入 & 符号,实际输入&-

    2018-10-11 12:27:12:178 - [debug] [MJSONWP] Calling AppiumDriver.setValue() with args: [["& ...

  2. 用VS2012建立core2.1网站项目后引用Microsoft.AspNetCore.Session不了

    做个.NET CORE的新项目,和往常一样,VS2017新建CORE项目(CORE2.1),NUGET引入session,结果引入不了,说什么版本不对应的,把SESSION降了一个版本,可以安装上了, ...

  3. 微信小程序开发填坑

    1.模拟器和真机的差异 在开发的过程中,在模拟器上表现得好好的,在真机上却出问题的例子数不胜数.譬如动画的使用,cover-view上面使用定位,在模拟器好好的,在真机却错乱等等等等.造成这些错乱主要 ...

  4. 用Python来玩微信跳一跳

    微信2017年12月28日发布了新版本,在小程序里面有一个跳一跳小游戏,试着点一点玩了下.第二天刚好在一篇技术公众号中,看到有大神用Python代码计算出按压时间,向手机发送android adb命令 ...

  5. vue设置默认地址和配送方式

    1.截图 2.address.html <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  6. Serializable接口

    Serializable这个接口起啥作用呢?? 这个接口没有提供任何方法,我们实现它有什么意义呢? Serializable接口是启用其序列化功能的接口.Serializable接口中没有任何方法,一 ...

  7. 设置Git用户信息

    $ git config --global user.name "leehongee" //给自己起个用户名 $ git config --globla user.email &q ...

  8. ubuntu之视频转换(Avconv的使用)

    1.安装 sudo apt-get install ffmpeg libav-tools 2.基本操作 avconv [options] [[infile options] -i infile] [[ ...

  9. 配置 -- php运行报Call to undefined function curl_init()的解决办法

    很早之前就出现过这个问题,网上百度了下,答案千篇一律,都是说: 1.在php.ini中开启curl扩展 2.将php目录下的libeay32.dll.ssleay32.dll.php5ts.dll拷贝 ...

  10. IDEA的这八条配置你一定要改!

    一定要改的八条军规.快捷键使用idea默认的,与其他同事保存一致 自动编译开关 忽略大小写开关 智能导包开关 悬浮提示开关 取消单行显示tabs的操作 项目文件编码 滚轴修改字体大小 设置行号显示 在 ...