比较裸的kd-tree,但是比较考验剪枝。

貌似除了经典的矩形距离剪枝之外,

还必须加个剪枝是某个矩形内的最小价格如果大于价格限制的话,则剪枝。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define N 200010
#define EPS 0.00000001
#define INF 1000000000000000007.0
#define KD 2
struct data{
int x,y,v;
double d;
int id;
data(const int &_x,const int &_y,const int &_v,const double &_d,const int &_id){
x=_x; y=_y; v=_v; d=_d; id=_id;
}
data(){}
}ans;
bool operator < (const data &a,const data &b){
if(fabs(a.d-b.d)>=EPS){
return a.d-b.d<-EPS;
}
return a.id<b.id;
}
int qp[KD],qv;
int n,root;
bool dn;
double sqr(int x)
{
return (double)x*(double)x;
}
int Abs(int x)
{
return x<0 ? (-x) : x;
}
struct Node
{
int minn[KD],maxx[KD],p[KD],v,id,minv;
int ch[2];
void Init()
{
for(int i=0;i<KD;++i)
minn[i]=maxx[i]=p[i];
minv=v;
ch[0]=ch[1]=0;
}
bool CheckIn()
{
for(int i=0;i<KD;++i)
if(!(minn[i]<=qp[i] && qp[i]<=maxx[i]))
return 0;
return 1;
}
int Dis()
{
if(CheckIn()){
return 0;
}
int res=2147483647;
res=min(res,Abs(minn[0]-qp[0]));
res=min(res,Abs(maxx[0]-qp[0]));
res=min(res,Abs(minn[1]-qp[1]));
res=min(res,Abs(maxx[1]-qp[1]));
return res;
}
}T[N<<1];
void Update(int rt)
{
for(int i=0;i<2;++i){
if(T[rt].ch[i]){
for(int j=0;j<KD;++j){
T[rt].minn[j]=min(T[rt].minn[j],T[T[rt].ch[i]].minn[j]);
T[rt].maxx[j]=max(T[rt].maxx[j],T[T[rt].ch[i]].maxx[j]);
}
T[rt].minv=min(T[rt].minv,T[T[rt].ch[i]].minv);
}
}
}
bool operator < (const Node &a,const Node &b)
{
return a.p[dn]!=b.p[dn] ? a.p[dn]<b.p[dn] : a.p[dn^1]<b.p[dn^1];
}
int Buildtree(int l=1,int r=n,bool d=0)
{
dn=d;
int m=(l+r>>1);
nth_element(T+l,T+m,T+r+1);
T[m].Init();
if(l!=m) T[m].ch[0]=Buildtree(l,m-1,d^1);
if(m!=r) T[m].ch[1]=Buildtree(m+1,r,d^1);
Update(m);
return m;
}
double Dis(int a[],int b[])
{
return sqrt(sqr(a[0]-b[0])+sqr(a[1]-b[1]));
}
void Query(int rt=root)
{
if(T[rt].v<=qv){
ans=min(ans,data(T[rt].p[0],T[rt].p[1],T[rt].v,Dis(T[rt].p,qp),T[rt].id));
}
int dd[2];
for(int i=0;i<2;i++)
if(T[rt].ch[i])
dd[i]=T[T[rt].ch[i]].Dis();
else dd[i]=2147483647;
bool f=(dd[0]<=dd[1]);
if(T[T[rt].ch[!f]].minv<=qv && (double)dd[!f]-ans.d<(-EPS)) Query(T[rt].ch[!f]);
if(T[T[rt].ch[f]].minv<=qv && (double)dd[f]-ans.d<(-EPS)) Query(T[rt].ch[f]);
}
int Zu,m;
int main()
{
// freopen("k.in","r",stdin);
scanf("%d",&Zu);
for(int zu=1;zu<=Zu;++zu){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%d%d%d",&T[i].p[0],&T[i].p[1],&T[i].v);
T[i].id=i;
}
root=(1+n>>1);
Buildtree();
for(int i=1;i<=m;++i){
ans.d=INF;
scanf("%d%d%d",&qp[0],&qp[1],&qv);
Query();
printf("%d %d %d\n",ans.x,ans.y,ans.v);
}
}
return 0;
}

【kd-tree】hdu5992 Finding Hotels的更多相关文章

  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. 【POJ 3740】 Easy Finding

    [题目链接] http://poj.org/problem?id=3740 [算法] Dancing Links算法解精确覆盖问题 详见这篇文章 : https://www.cnblogs.com/g ...

  4. 【HDU5992】Finding Hotels 【KD树】

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

  5. 【Symmetric Tree】cpp

    题目: Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). F ...

  6. 【Same Tree】cpp

    题目: Given two binary trees, write a function to check if they are equal or not. Two binary trees are ...

  7. 【LSGDOJ1834 Tree】树链剖分

    题目描述 给定一个N个结点的无向树,树中的结点按照1...N编号,树中的边按照1...N − 1编号,每条边都赋予一个权值.你需要编写程序支持以下三种操作: 1.    CHANGE i v:将i号边 ...

  8. 【BZOJ4154】Generating Synergy【kd树】

    题意 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 分析 我们以dfs序为横坐标,深度为纵坐标,建kd树.我们每次更新,都是在kd树中更 ...

  9. 【BZOJ3489】A simple rmq problem【kd树】

    题意 给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直接输出0.我会采取一些措施强制在线. 分析 预处理 ...

随机推荐

  1. It is possible that this issue is resolved by uninstalling an existi

    使用真机连接Android Studio测试时出现这样的错误: 解决方法: 设置Android Studio 中Instant Run中的选项为不选中 根据以下路径,找到Instant Run中的选项 ...

  2. IBM InfoSphere DataStage and QualityStage

    Info coms from https://www.ibm.com/support/knowledgecenter/en/SSZJPZ_9.1.0/com.ibm.swg.im.iis.ds.nav ...

  3. linux安装lamp

    github https://github.com/zblogcn/zblogphp Installation If your server system: CentOS yum -y install ...

  4. Bookmarks www

    Bookmarks alexis- (Alex Incogito) - Repositories · GitHub GitHub - aetcnc-Arduino_DeltaHMI_RS485 Ope ...

  5. 【bzoj3786】星系探索

    ETT模版题. 真正的Eular-Tour-Tree维护的是树的欧拉序. 由于各种原因,没人知道怎么维护欧拉序,所以我写的是个假的,维护dfs序的. 本质还是用Splay维护序列. 然后因为我常数太差 ...

  6. Swift 特殊关键字 与符号

    #available() 函数来检查API函数的可用性 // 判断当前版本是否 iOS8.0+,OSX10.10+以及以其他平台 if #available(iOS 8.0, OSX 10.10, * ...

  7. Mysql 数据库学习笔记03 存储过程

    一.存储过程:如下           通过 out .inout 将结果输出,可以输出多个值. * 调用存储过程: call 存储名称(参数1,参数2,...); 如指定参数不符合要求,返回 Emp ...

  8. Leetcode 之Length of Last Word(38)

    做法很巧妙.分成左右两个对应的部分,遇到左半部分则入栈,遇到右半部分则判断对应的左半部分是否在栈顶.注意最后要判断堆栈是否为空. bool isValid(const string& s) { ...

  9. java的collection集合

    # 原创,转载请先留言 1.集合的由来 数组的长度是固定的,当需要增加或减少元素时需要对数组重新定义,太麻烦了.java内部给我们提供了集合类,能存储任意对象,长度可以改变的,随着元素的增加而增加,随 ...

  10. mybatis多表查询,自动生成id

    主要是在配置文件中,配置好所要包含的字段. 类关系:account----role,1对1 account包含role类 java类: public class Account{ private In ...