找旅馆问题

news2025/1/13 15:54:30

一 问题描述

有 N 家旅馆,每家旅馆都有位置和价格,有 M 个客人希望找到一家价格可接受的最近旅馆。

二 输入和输出

1 输入

每个测试用例的第 1 行都包含两个整数 N(N ≤200000)和 M(M ≤20000),分别表示旅馆数量和客人数量。接下来的 N 行,每行都包含3个整数 x、y 和 c(1≤x , y,c ≤N),其中 x、y 是旅馆的坐标,c 是其价格,保证 N 个旅馆都有不同的 x、y 和 c 。接下来的 M 行,每行都描述一个客人的查询,其中 x 、y 是客人的坐标,c 是客人可接受的最高价格。

2 输出

对每个客人的查询,都单行输出价格可接受的最近旅馆。若有多个旅馆的价格可以接受且距离最小,则输出第 1 个。

三 输入和输出样例

1 输入样例

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

2 输出样例

1 1 1

2 3 2

3 2 3

5 2 1

2 1 2

2 1 2

1 4 4

3 3 5

四 分析和设计

1 分析

本问题为三维数据,包括二维坐标和价格,可采用 KD 树解决。

2 算法设计

(1)根据输入数据的二维坐标创建 KD 树。

(2)在 KD 树中查询距离 p 最近且价格不超过 c 的旅馆。

3 算法实现

查询距离给定点 p 最近且价格不超过c 的点,算法步骤如下。

(1)创建一个序对,第 1 个元素记录当前节点到 p 的距离,第 2 个元素记录当前节点;然后定义一个变量 res,存储离 p 最近且价格不超过 c 的序对。

(2)查询时从树根开始,首先计算树根与 p 的距离,用 cur 记录距离、节点序对。

(3)若 p.x [dim]<kd[rt].x[dim],则首先在左子树 lc 中查询,否则在右子树 rc 中查询。若 p.x [dim]≥kd[rt].x [dim],则交换 lc 和 rc,这样就可以统一为首先在 lc 中查询。

(4)若 lc 不空,则在 lc 中递归查询 query(lc, m , dep+1, p)。

(5)若还没有答案,且当前节点的价格小于 p 的价格,则更新答案为当前节点 res=cur,flag=1,还需要在右子树中查询;若当前节点的价格小于 p 的价格且当前节点到 p 的距离小于 res 到 p 的距离,或者

两者相等但 cur 的序号在前,则更新 res=cur;若以 p 为球心且以 p 到 res 的距离为半径的圆与树根的另一区域相交,则 flag=1,还需要在右子树中查询。

(6)若 rc 不空且 flag=1,则在 rc 中递归查询 query(rc,m,dep+1, p)。

五 代码

package com.platform.modules.alg.alglib.hdu5992;

import javafx.util.Pair;

import java.util.Arrays;

public class Hdu5992 {
    private int inf = 0x3f3f3f3f;
    private int maxn = 200000 + 10;
    int idx;
    public String output = "";
    int sz[] = new int[maxn << 2];
    Node a[] = new Node[maxn];
    Node kd[] = new Node[maxn << 2];

    Pair<Long, Node> res;

    public Hdu5992() {
        res = new Pair<>(-1L, new Node());

        for (int i = 0; i < a.length; i++) {
            a[i] = new Node();
        }

        for (int i = 0; i < kd.length; i++) {
            kd[i] = new Node();
        }
    }

    void build(int rt, int l, int r, int dep) {
        if (l > r) return;
        sz[rt] = 1;
        sz[rt << 1] = sz[rt << 1 | 1] = 0;
        idx = dep % 2;// 注意只按二维建树
        int mid = (l + r) >> 1;
        Arrays.sort(a, l, r + 1);
        kd[rt] = a[mid];
        build(rt << 1, l, mid - 1, dep + 1);
        build(rt << 1 | 1, mid + 1, r, dep + 1);
    }

    Long dis(int rt, Node p) { // 求距离二维
        return Long.valueOf((p.x[0] - kd[rt].x[0]) * (p.x[0] - kd[rt].x[0]) +
                (p.x[1] - kd[rt].x[1]) * (p.x[1] - kd[rt].x[1]));
    }

    void query(int rt, Node p, int dep) {
        if (sz[rt] == 0) return;
        Pair<Long, Node> cur = new Pair(dis(rt, p), kd[rt]);
        int lc = rt << 1, rc = rt << 1 | 1, dim = dep % 2, flag = 0;
        if (p.x[dim] >= kd[rt].x[dim]) {
            int temp = lc;
            lc = rc;
            rc = temp;
        }

        if (sz[lc] > 0)
            query(lc, p, dep + 1);
        if (res.getKey() == -1) {//第一个
            if (cur.getValue().x[2] <= p.x[2])
                res = cur;
            flag = 1;
        } else {
            if (cur.getValue().x[2] <= p.x[2] && (cur.getKey() < res.getKey()
                    || (cur.getKey() == res.getKey() && cur.getValue().id < res.getValue().id)))
                res = cur;
            if ((kd[rt].x[dim] - p.x[dim]) * (kd[rt].x[dim] - p.x[dim]) <= res.getKey())
                flag = 1;
        }
        if (sz[rc] > 0 && flag == 1)
            query(rc, p, dep + 1);
    }

    public String cal(String input) {
        int t, n, m;
        String[] line = input.split("\n");
        t = Integer.parseInt(line[0]);
        int count = 1;
        while (t-- > 0) {
            String[] num = line[count++].split(" ");
            n = Integer.parseInt(num[0]);
            m = Integer.parseInt(num[1]);
            for (int i = 0; i < n; ++i) {
                String[] postion = line[count++].split(" ");
                for (int j = 0; j < 3; ++j) {
                    a[i].x[j] = Integer.parseInt(postion[j]);
                }
                a[i].id = i;
            }
            build(1, 0, n - 1, 0);
            while (m-- > 0) {
                Node p = new Node();
                Node ans;
                String[] query = line[count++].split(" ");
                for (int i = 0; i < 3; ++i) {
                    p.x[i] = Integer.parseInt(query[i]);
                }


                res = new Pair<>(-1L, new Node());
                query(1, p, 0);
                ans = res.getValue();
                output += ans.x[0] + " " + ans.x[1] + " " + ans.x[2] + "\n";
            }
        }
        return output;
    }

    class Node implements Comparable<Node> {
        int x[] = new int[3];
        int id; // 输入序号


        public int compareTo(Node o) {
            return x[idx] > o.x[idx] ? 1 : -1; // 升序
        }
    }
}

六 测试 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/94245.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python之Socket编程: 轻松连接你的应用程序

前言 什么是Socket? Python 的 Socket 模块提供了一个标准的接口&#xff0c;可以让你使用网络连接来通信。 Socket 是一种网络通信技术&#xff0c;它提供了一个通用的接口来连接不同类型的网络&#xff0c;例如互联网、局域网和本地环回地址。你可以使用 Python 的 Socke…

为什么RocketMQ不使用Zookeeper作为注册中心呢?

根据CAP理论&#xff0c;同时最多只能满⾜两个点&#xff0c;而zookeeper满足的是CP&#xff0c;也就是说zookeeper并不能保证服务的可用性&#xff0c;zookeeper在进⾏选举的时候&#xff0c;整个选举的时间太⻓&#xff0c;期间整个集群都处于不可用的状态&#xff0c;而这对…

游戏网页设计成品 学校班级网页制作模板 大学生静态HTML网页源码 dreamweaver网页作业 简单网页课程成品

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

makefile编译一个工程碰到的问题(仅做为记录,没有逻辑)

一、编译选项如下 test : all$(CC) $(CXXFLAGS) -I/DecoderFFMPEGLive/ -o Test/$.o -c Test/test.cpp$(CC) $(CXXFLAGS) -o $ Test/$.o -L. -lDecoderFFMPEGLive -lpthread 报错误&#xff1a;/usr/bin/ld: cannot open output file test: Is a directory 是因为我想生成…

论文笔记CATEGORICAL REPARAMETERIZATION WITH GUMBEL-SOFTMAX

目录Gumbel-Softmax分布Gumbel-Softmax EstimatorStraight-Through (ST) Gumbel-Softmax EstimatorStraight-Through Estimator (STE)Straight-Through (ST) Gumbel-Softmax Estimator参考Gumbel-Softmax分布 Gumbel-Softmax分布是一个定义在单纯形(simplex)上的连续分布。 Gu…

项目成功的制胜法宝——有效的领导力

项目经理在开展项目的过程中&#xff0c;为了确保项目的成功且实现价值交付&#xff0c;往往会使出浑身解数、有勇有谋、甚至熟练使用“孙子兵法”。毕竟在很多情况下&#xff0c;需要“带兵打仗”的项目经理权力微弱&#xff0c;不能像“将军”那般拥有权力的加持、一呼百应。…

javaSE - 认识字符串(String class)上半部分

前言 字符串: 在C语言里面 是 没有字符串类型的&#xff01; 但是&#xff0c;在 Java 和 C 里&#xff0c;有字符串类型【String】 什么是字符串&#xff1f;什么是字符&#xff1f; 在java里面有表示字符串的类 String 使用双引号&#xff0c;且双引号中包含任意数量的字符【…

42 | iptables的使用方法

1 iptables简介 iptables是一个linux下的防火墙工具&#xff0c;能帮助我们基于规则进行网络流量控制。它可以做到&#xff0c;但不限于以下功能&#xff1a; 允许/拒绝某种协议的链接建立&#xff0c;比如TCP&#xff0c;UDP允许/拒绝 来自某个ip的访问允许/拒绝某个端口被访…

田径运动会成绩管理系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 模块划分&#xff1a;通知类型、通知信息、裁判信息、运动员信息、项目类型、项目信息、场地信息、项目安排、报名信息、…

深度学习目标检测:YOLOv5实现红绿灯检测(含红绿灯数据集+训练代码)

深度学习目标检测&#xff1a;YOLOv5实现红绿灯检测(含红绿灯数据集训练代码) 1. 前言 本篇博客&#xff0c;我们将手把手教你搭建一个基于YOLOv5的红绿灯目标检测项目。目前&#xff0c;基于YOLOv5s的红绿灯检测精度平均值mAP_0.50.93919&#xff0c;mAP_0.5:0.950.63967&…

_9LeetCode代码随想录算法训练营第九天-C++栈和队列

_9LeetCode代码随想录算法训练营第九天-C栈和队列 理论基础232.用栈实现队列225.用队列实现栈 基础知识 C标准库版本 HP STL 其他版本的C STL&#xff0c;一般是以HP STL为蓝本实现出来的&#xff0c;HP STL是C STL的第一个实现版本&#xff0c;而且开放源代码。P.J.Plauge…

【软件测试】测试面试,面试官其实想要的答案......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试经理 保障xxx的…

Python入门自学进阶-Web框架——29、DjangoAdmin项目应用-整表只读、自定义用户认证

一、整表只读 对于readonly_fields是对单个字段设置只读&#xff0c;现在要对整个表使用只读&#xff0c;也做成可配置的。在自己项目的admin.py中进行配置&#xff0c;如在mytestapp_admin.py中对Customer进行整表只读配置&#xff0c;在基类BaseAdmin中增加readonly_table …

juc-1-进程/线程/创建线程代码

1 场景&#xff1a; 1&#xff1a;执行的任务&#xff0c;短而快。不能是很耗时的任务。 2&#xff1a;异步写日志(日志框架底层就是)。 3&#xff1a;异步发送邮件&#xff0c;短信。 用MQ 最好。 4&#xff1a;多线程下载 2 进程与线程 进程&#xff1a; 进程&#xff1…

Centerfusion算法环境配置及模型训练

Centerfusion算法环境配置及模型训练概述1. 配置conda环境1.1 新建conda环境1.2 安装cuda1.3 安装cudnn1.4 安装pytorch1.5 安装cocoapi2. 配置Centerfusion2.1 克隆CenterFusion的github库2.2 安装依赖包2.3 安装DCNv22.4 下载nuscenes-devkit包3. 数据集准备3.1 下载数据集3.…

细粒度图像分类论文研读-2019

文章目录Cross-X Learning for Fine-Grained Visual Categorization&#xff08;by end-to-end&#xff09;AbstractIntroductionApproachPreliminariesCross- Category Cross-Semantic RegularizerCross-Layer RegularizerOptimizationLearning a Mixture of Granularity-Spec…

公司刚来的京东架构师:看完我写的 spring 笔记,甩给了我一份文档

Spring 是分层的 full-stack&#xff08;全栈&#xff09; 轻量级开源框架&#xff0c;以 IoC 和 AOP 为内核&#xff0c;提供了展现层 SpringMVC 和业务层事务管理等众多的企业级应⽤技术&#xff0c;还能整合开源世界众多著名的第三⽅框架和类库&#xff0c;已经成为使⽤最多…

优维助力国内某省级商业银行同城异地灾备自动化建设

银监会在《商业银行数据中心监管指引》中明确要求“商业银行每年至少进行一次重要信息系统专项灾备切换演练&#xff0c;每三年至少一次重要信息系统全面灾备切换演练&#xff0c;以真实业务接管为目标&#xff0c;验证灾备系统有效接管生产系统与安全回切的能力&#xff0c;并…

SpringSecurity概念以及整合ssm框架

基本概念 Spring中提供安全认证服务的框架&#xff0c;认证&#xff1a;验证用户密码是否正确的过程&#xff0c;授权&#xff1a;对用户能访问的资源进行控制 用户登录系统时我们协助 SpringSecurity 把用户对应的角色、权限组装好&#xff0c;同时把各个资源所要求的权限信息…

毕业设计-基于大数据技术的旅游推荐系统-python

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…