原题链接

Description

给出n(n≤2×105)个二维平面上的点,每个点有权值c。m(m≤2×104)次询问,求所有权值小于等于c的点中,距离坐标(x,y)的欧几里得距离最小的点。如果有多个满足条件的点,输出最靠前的一个。

Solution

拿k-d树搞一搞就好啦。

如果一个子树代表的区域中所有点的权值都大于c,或者到所有点的距离都大于当前答案,就跳过不做。

Code

//Finding Hotels
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
inline char gc()
{
static char now[1<<16],*S,*T;
if(S==T) {T=(S=now)+fread(now,1,1<<16,stdin); if(S==T) return EOF;}
return *S++;
}
inline int read()
{
int x=0; char ch=gc();
while(ch<'0'||'9'<ch) ch=gc();
while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();
return x;
}
typedef long long lint;
int const N=2e5+10;
lint const INF=1LL<<62;
int n,m;
int rt,ch[N][2];
struct point{lint c[3]; int id;} pt[N];
struct zone{lint c1[3],c2[3];} zn[N];
int D; bool cmpPt(point x,point y) {return x.c[D]<y.c[D];}
void create(int p)
{
for(int k=0;k<3;k++) zn[p].c1[k]=zn[p].c2[k]=pt[p].c[k];
ch[p][0]=ch[p][1]=0;
}
void update(int p)
{
for(int k=0;k<3;k++)
zn[p].c1[k]=min(pt[p].c[k],min(zn[ch[p][0]].c1[k],zn[ch[p][1]].c1[k])),
zn[p].c2[k]=max(pt[p].c[k],max(zn[ch[p][0]].c2[k],zn[ch[p][1]].c2[k]));
}
void build(int &p,int L,int R,int k0)
{
p=L+R>>1; create(p);
if(k0==3) k0=0; D=k0;
nth_element(pt+L,pt+p,pt+R+1,cmpPt);
if(L<p) build(ch[p][0],L,p-1,k0+1);
if(p<R) build(ch[p][1],p+1,R,k0+1);
update(p);
}
point A; int r; lint rDst;
lint dst(point B)
{
if(B.c[2]>A.c[2]) return INF;
return (A.c[0]-B.c[0])*(A.c[0]-B.c[0])+(A.c[1]-B.c[1])*(A.c[1]-B.c[1]);
}
lint dst(zone z)
{
if(z.c1[0]==INF||z.c1[2]>A.c[2]) return INF+1;
lint sum=0;
for(int k=0;k<2;k++)
{
lint d=0;
if(A.c[k]<z.c1[k]) d=z.c1[k]-A.c[k];
else if(z.c2[k]<A.c[k]) d=A.c[k]-z.c2[k];
sum+=d*d;
}
return sum;
}
void query(int p)
{
lint d=dst(pt[p]);
if(d<rDst||(d==rDst&&pt[p].id<pt[r].id)) r=p,rDst=d;
if(dst(zn[ch[p][0]])<=rDst) query(ch[p][0]);
if(dst(zn[ch[p][1]])<=rDst) query(ch[p][1]);
}
int main()
{
int task=read();
for(int k=0;k<3;k++) zn[0].c1[k]=INF,zn[0].c2[k]=-INF;
while(task--)
{ n=read(),m=read();
memset(pt,0,sizeof pt);
for(int i=1;i<=n;i++)
for(int k=0;k<3;k++) pt[i].c[k]=read();
for(int i=1;i<=n;i++) pt[i].id=i;
rt=0; build(rt,1,n,0);
for(int i=1;i<=m;i++)
{
for(int k=0;k<3;k++) A.c[k]=read();
r=0,rDst=INF,query(rt);
printf("%lld %lld %lld\n",pt[r].c[0],pt[r].c[1],pt[r].c[2]);
} }
return 0;
}

P.S.

要开long long哦。

55行在不合法时返回INF+1,是因为我懒得判断左右子树是否存在而这么写的。由于要求最靠前的点,所以dst()==rDst的时候也要做,但如果dst()由于不合法而返回INF的话,在rDst==INF的时候就会有问题,会去递归并不存在的子树从而出锅。其实先判断一下子树是否存在再做比较好,不容易出锅而且比较清晰。

HDU5992 - Finding Hotels的更多相关文章

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

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

  2. 【kd-tree】hdu5992 Finding Hotels

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

  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 【KD树】

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

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

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

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

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

  7. HDU 5992/nowcoder 207K - Finding Hotels - [KDTree]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5992 题目链接:https://www.nowcoder.com/acm/contest/207/K ...

  8. 【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 ...

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

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

随机推荐

  1. hibernate解读之session--基于最新稳定版5.2.12

    前言 hibernate是一个实现了JPA标准的,用于对象持久化的orm框架.博主近一年开发都在使用. 前段时间在工作中遇到了一个hibernate的问题,从数据库查找得到对象后,修改了其中部分字段值 ...

  2. form表单action=""的作用

    看项目时发现action="",可仍旧提交到后台相关页面了.查了一下,action=""相当于当前页面刷新,不过页面按照form表单提交参数到后台@参考文章

  3. Servlet--ServletContext接口

    Servlet--ServletContext接口 定义public interface ServletContext 定义了一个 Servlet 的环境对象,通过这个对象,Servlet 引擎向 S ...

  4. SQL Server错误严重性级别和异常处理

    关于SQL Server的错误严重性级别的说明,强烈认真看一下下面的两个链接 脱机帮助 ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/sqlerrm9/html/ ...

  5. A/X家FPGA架构及资源评估

    评估对比xilinx以及altera两家FPGA芯片逻辑资源. 首先要说明, 现今FPGA除了常规逻辑资源,还具有很多其他片内资源比如块RAM.DSP单元.高速串行收发器.PLL.ADC等等,用以应对 ...

  6. 【转】sed 高级用法

    首先,应该明白模式空间的定义.模式空间就是读入行所在的缓存,sed对文本行进行的处理都是在这个缓存中进行的.这对接下来的学习是有帮助的. 在正常情况下,sed将待处理的行读入模式空间,脚本中的命令就一 ...

  7. css变量的用法——(--cssName)

    CSS变量,又称——CSS自定义属性,现在很多CSS预处理/后处理程序已作了相关快捷的编译处理, 基本用法有哪些呢,我们先看一个简单的栗子:——要求,创建一个五个块元素居中的分栏样式,奇数和偶数同高不 ...

  8. mysql5.6默认情况下内存占用太大

    下载了mysql5.6.12 ,默认占用内存达400多M,  而原来使用的5.0 只有30M.. 解决方案:调整以下参数----------------performance_schema_max_t ...

  9. 《Python网络编程》学习笔记--使用谷歌地理编码API获取一个JSON文档

    Foundations of Python Network Programing,Third Edition <python网络编程>,本书中的代码可在Github上搜索fopnp下载 本 ...

  10. VUE2.0增删改查附编辑添加model(弹框)组件共用

    Vue实战篇(增删改查附编辑添加model(弹框)组件共用) 前言 最近一直在学习Vue,发现一份crud不错的源码 预览链接 https://taylorchen709.github.io/vue- ...