HDU 5992/nowcoder 207K - Finding Hotels - [KDTree]
题目链接: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]的更多相关文章
- hdu-5992 Finding Hotels(kd-tree)
题目链接: Finding Hotels Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/ ...
- Hdu-5992 2016ACM/ICPC亚洲区青岛站 K.Finding Hotels KDtree
题面 题意:二维平面上有很多点,每个点有个权值,现在给你一个点(很多组),权值v,让你找到权值小于等于v的点中离这个点最近的,相同的输出id小的 题解:很裸的KDtree,但是查询的时候有2个小限制, ...
- Finding Hotels
Finding Hotels http://acm.hdu.edu.cn/showproblem.php?pid=5992 Time Limit: 2000/1000 MS (Java/Others) ...
- HDU5992 - Finding Hotels
原题链接 Description 给出个二维平面上的点,每个点有权值.次询问,求所有权值小于等于的点中,距离坐标的欧几里得距离最小的点.如果有多个满足条件的点,输出最靠前的一个. Solution 拿 ...
- 【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 ...
- HDU 5992 Finding Hotels(KD树)题解
题意:n家旅店,每个旅店都有坐标x,y,每晚价钱z,m个客人,坐标x,y,钱c,问你每个客人最近且能住进去(非花最少钱)的旅店,一样近的选排名靠前的. 思路:KD树模板题 代码: #include&l ...
- 【kd-tree】hdu5992 Finding Hotels
比较裸的kd-tree,但是比较考验剪枝. 貌似除了经典的矩形距离剪枝之外, 还必须加个剪枝是某个矩形内的最小价格如果大于价格限制的话,则剪枝. #include<cstdio> #inc ...
- HDU 5992 kd-tree
还记得青岛的时候和蕾姐讨论了近三个小时也不知道这是什么东西 后来发现是kdtree 于是拖到寒假才补这个算法 写完几道模板题发现多维的kdtree查找最近也是很简单的拓展 于是很快1A了这道题 它真的 ...
- 2016 ICPC青岛站---k题 Finding Hotels(K-D树)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5992 Problem Description There are N hotels all over ...
随机推荐
- Newtonsoft.Json2.0下面序列化和反序列化
序列化 string xml = JavaScriptConvert.SerializeObject(dataTable); 反序列化 JavaScriptConvert.DeserializeObj ...
- 基于Centos搭建 Hadoop 伪分布式环境
软硬件环境: CentOS 7.2 64 位, OpenJDK- 1.8,Hadoop- 2.7 关于本教程的说明 云实验室云主机自动使用 root 账户登录系统,因此本教程中所有的操作都是以 roo ...
- Spark 核心篇-SparkEnv
本章内容: 1.功能概述 SparkEnv是Spark的执行环境对象,其中包括与众多Executor执行相关的对象.Spark 对任务的计算都依托于 Executor 的能力,所有的 Executor ...
- win8下C盘不能读写的解决方案[zz]
做系统安全的时候发现了这个/setintegritylevel参数,没有找到更多资料,找到此文,看来这个参数有点神奇哟!我一个同事遇到了这个问题,主要症状:1.C 盘文件不能修改2.C 盘不能新建文件 ...
- 处理用千牛导出淘宝数据,供Logstash到Elasticsearch使用。(NodeJS)
var rf=require("fs"); // 加载编码转换模块 //npm install iconv-lite var iconv = require('iconv-lite ...
- 对ThreadLocal实现原理的一点思考
前言 在<透彻理解Spring事务设计思想之手写实现>中,已经向大家揭示了Spring就是利用ThreadLocal来实现一个线程中的Connection是同一个,从而保证了事务.本篇博客 ...
- 使用SharedPreference和对象流存储对象
编写PreferencesUtils工具类可以简单对象(可以缓存对象中所有public的简单属性) 另外研究了Preference存储与直接采用对象文件缓存方式的区别 第一次写文件时 1.效率,直 ...
- 转:pycharm community debug django projects
原文:https://automationpanda.com/2017/09/14/django-projects-in-pycharm-community-edition/comment-page- ...
- 【emWin】例程十一:GIF图像显示
介绍: 本例程介绍gif格式图像显示的方法以及在GMT70,iCore3_ADP,7寸液晶模块.4.3寸液晶模块, VGA模块上的移植. 实验指导书及代码包下载: 链接:http://pan.baid ...
- easyui 自定义验证规则 验证用户是否已经存在 远程ajax验证
easyui远程ajax验证 2014年09月30日 22:29:32 clj198606061111 阅读数:6130 标签: easyui 更多 个人分类: jqueryeasyui 版权声明:本 ...