2024蓝桥杯每日一题(并查集)

news2024/12/26 22:44:51

备战2024年蓝桥杯 -- 每日一题
Python大学A组

        试题一:奶酪
        试题二:合并集合
        试题三:连通块中点的数量
        试题四:网络分析


试题一:奶酪

【题目描述】

        现有一块大奶酪,它的高度为 hℎ,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞。我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为 z=0,奶酪的上表面为 z=h。 现在,奶酪的下表面有一只小老鼠 Jerry,它知道奶酪中所有空洞的球心所在的坐标如果两个空洞相切或是相交,则 Jerry 可以从其中一个空洞跑到另一个空洞,特别地,如果一个空洞与下表面相切或是相交,Jerry 则可以从奶酪下表面跑进空洞;如果一个空洞与上表面相切或是相交,Jerry 则可以从空洞跑到奶酪上表面。

        位于奶酪下表面的 Jerry 想知道,在不破坏奶酪的情况下,能否利用已有的空洞跑到奶酪的上表面去? 

        空间内两点 P1(x1,y1,z1)、P2(x2,y2,z2)的距离公式如下:

【输入格式】

        每个输入文件包含多组数据。  

        输入文件的第一行,包含一个正整数 T,代表该输入文件中所含的数据组数。  

        接下来是 T 组数据,每组数据的格式如下:

        第一行包含三个正整数 n,h,ℎ 和 r,两个数之间以一个空格分开,分别代表奶酪中空洞的数量,奶酪的高度和空洞的半径。  

        接下来的 n 行,每行包含三个整数 x、y、z,两个数之间以一个空格分开,表示空洞球心坐标为 (x,y,z)。

【输出格式】

        输出文件包含 T行,分别对应 T组数据的答案,如果在第 i 组数据中,Jerry 能从下表面跑到上表面,则输出 Yes,如果不能,则输出 No

【数据范围】

        1≤n≤1000,
        1≤h,r≤10⁹,
        T≤20,

【输入样例】

3 
2 4 1 
0 0 1 
0 0 3 
2 5 1 
0 0 1 
0 0 4 
2 5 2 
0 0 2 
2 0 4

【输出样例】

Yes
No
Yes

【解题思路】

        首先找到所有的与底面和顶面相交或相切的点,然后两层循环遍历,如果两个球相交或相切也就是两个求联通,则合并一下。处理完成后,枚举每一个与地面相交或相切的点与顶点,如果二者有相同的父节点说明上下联通。

【Python程序代码】

from collections import *
T = int(input())
def find(x):
    if p[x]!=x:p[x] = find(p[x])
    return p[x]

def dist(x1,y1,z1,x2,y2,z2):
    return ( (x2-x1)**2 + (y2-y1)**2 + (z2-z1)**2 )**0.5
for _ in range(T):
    n,h,r = map(int,input().split())
    p = [i for i in range(n+5)]
    a = [[0,0,0]]
    s1,s2 = [0],[0]
    for i in range(n):
        x,y,z = map(int,input().split())
        a.append([x,y,z])
        if z-r<=0:s1.append(i+1)
        if z+r>=h:s2.append(i+1)
    if not len(s1) or not len(s2):
        print('No')
        continue
    for i in range(1,n+1):
        for j in range(i+1,n+1):
            if find(i)==find(j):continue
            d = dist(a[i][0],a[i][1],a[i][2],a[j][0],a[j][1],a[j][2])
            if d<=2*r:
                p[ find(i) ] = find(j)
    f = 0
    for i in range(1,len(s1)):
        if f:break
        for j in range(1,len(s2)):
            if find( s1[i] ) == find(s2[j]):
                f=1; print('Yes')
                break
    if not f:print('No')

试题二:合并集合

【题目描述】

一共有 n 个数,编号是 1∼n,最开始每个数各自在一个集合中。

现在要进行 m 个操作,操作共有两种:

  1. M a b,将编号为 a 和 b 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
  2. Q a b,询问编号为 a 和 b 的两个数是否在同一个集合中;

【输入格式】

        第一行输入整数 n 和 m。

        接下来 m 行,每行包含一个操作指令,指令为 M a b 或 Q a b 中的一种。

【输出格式】

        对于每个询问指令 Q a b,都要输出一个结果,如果 a� 和 b� 在同一集合内,则输出 Yes,否则输出 No

        每个结果占一行。

【数据范围】

        1≤n,m≤105

【输入样例】

4 5
M 1 2
M 3 4
Q 1 2
Q 1 3
Q 3 4

【输出样例】

Yes
No
Yes

【解题思路】

        模板题,不过Python好像过不了?

【Python程序代码】

import sys
imput = sys.stdin.readline
n,m = map(int,input().split())
p = [i for i in range(n+5)]
def find(x):
    if p[x]!=x:p[x] = find(p[x])
    return p[x]
for i in range(m):
    s = list(input().split())
    a,b = int(s[1]),int(s[2])
    if s[0]=='M':
        if find(a)==find(b):continue
        else: p[find(a)]=find(b)
    else:
        if find(a)==find(b):print('Yes')
        else: print('No')

试题三:连通块中点的数量

【题目描述】

        给定一个包含 n 个点(编号为 1∼n)的无向图,初始时图中没有边。现在要进行 m 个操作,操作共有三种:

  1. C a b,在点 a 和点 b 之间连一条边,a 和 b 可能相等;
  2. Q1 a b,询问点 a 和点 b 是否在同一个连通块中,a 和 b 可能相等;
  3. Q2 a,询问点 a 所在连通块中点的数量;

【输入格式】

        第一行输入整数 n 和 m 。

        接下来 m 行,每行包含一个操作指令,指令为 C a bQ1 a b 或 Q2 a 中的一种。

【输出格式】

        对于每个询问指令 Q1 a b,如果 a 和 b 在同一个连通块中,则输出 Yes,否则输出 No

        对于每个询问指令 Q2 a,输出一个整数表示点 a 所在连通块中点的数量

        每个结果占一行。

【数据范围】

        1≤n,m≤10⁵

【输入样例】

5 5
C 1 2
Q1 1 2
Q2 1
C 2 5
Q2 5

【输出样例】

Yes
2
3

【解题思路】

        在原来并查集的合并基础上加上一个点的数量合并就ok。

【Python程序代码】

n,m = map(int,input().split())
p = [i for i in range(n+5)]
size1 = [1 for i in range(n+5)]
def find(x):
    if p[x]!=x:p[x]=find(p[x])
    return p[x]
def merge(a,b):
    x,y = find(a),find(b)
    p[x] = y
    size1[y] += size1[x]
for i in range(m):
    s = list(input().split())
    if s[0]=='C':
        if s[1]==s[2]:continue
        if find(int(s[1])) == find( int(s[2]) ):continue
        merge(int(s[1]),int(s[2]))
    if s[0]=='Q1':
        if find(int(s[1])) == find( int(s[2]) ):
            print('Yes')
        else:
            print('No')
    if s[0]=='Q2':
        print( size1[find( int(s[1]) )] )



试题四:网络分析

【题目描述】

        小明正在做一个网络实验。他设置了 n 台电脑,称为节点,用于收发和存储数据。初始时,所有节点都是独立的,不存在任何连接。小明可以通过网线将两个节点连接起来,连接后两个节点就可以互相通信了。两个节点如果存在网线连接,称为相邻。小明有时会测试当时的网络,他会在某个节点发送一条信息,信息会发送到每个相邻的节点,之后这些节点又会转发到自己相邻的节点,直到所有直接或间接相邻的节点都收到了信息。所有发送和接收的节点都会将信息存储下来。一条信息只存储一次。给出小明连接和测试的过程,请计算出每个节点存储信息的大小。

【输入格式】

        输入的第一行包含两个整数 n,m,分别表示节点数量和操作数量。节点从 1 至 n 编号。接下来 m 行,每行三个整数,表示一个操作。

  • 如果操作为 1 a b,表示将节点 a 和节点 b 通过网线连接起来。当 a = b 时,表示连接了一个自环,对网络没有实质影响。
  • 如果操作为 2 p t,表示在节点 p 上发送一条大小为 t 的信息。

【输出格式】

        输出一行,包含 n 个整数,相邻整数之间用一个空格分割,依次表示进行完上述操作后节点 1 至节点 n 上存储信息的大小。

【数据范围】

        1≤n≤10000,
        1≤m≤105,
        1≤t≤100

【输入样例】

4 8
1 1 2
2 1 10
2 3 5
1 4 1
2 2 2
1 1 2
1 2 4
2 2 1

【输出样例】

13 13 5 3

【解题思路】

        思考并查集的树是如何构造出来的,当没有进行路径压缩时,这个点的信息量可以考虑成该点到对应父节点路径上结点的信息量之和,那么两个集合合并时该如何维护结点信息量呢?如果p[a]=b也就是a结点指向b结点,那么对应的d[a] -= d[b]即可。

【Python程序代码】

n,m = map(int,input().split())
p = [i for i in range(n+5)]
size1 = [1 for i in range(n+5)]
def find(x):
    if p[x]!=x:p[x]=find(p[x])
    return p[x]
def merge(a,b):
    x,y = find(a),find(b)
    p[x] = y
    size1[y] += size1[x]
for i in range(m):
    s = list(input().split())
    if s[0]=='C':
        if s[1]==s[2]:continue
        if find(int(s[1])) == find( int(s[2]) ):continue
        merge(int(s[1]),int(s[2]))
    if s[0]=='Q1':
        if find(int(s[1])) == find( int(s[2]) ):
            print('Yes')
        else:
            print('No')
    if s[0]=='Q2':
        print( size1[find( int(s[1]) )] )

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

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

相关文章

Java SE入门及基础(44)

目录 I / O流(上) 1. 什么是I / O流 过程分析 I / O的来源 Java 中的 I / O流 2. 字节流 OutputStream 常用方法 文件输出流 FileOutputStream 构造方法 示例 InputStream 常用方法 文件输入流 FileInputStream 构造方法 示例 综合练习 字节流应用场景 Java SE文…

命名空间——初识c++

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 经典的Hello Word 起航c关键字c语言的命名冲突问题域作用限定符::命名空间 namespace命名空间定义命名空间的使用1.加命名空间名称及作用域限定符2.使用…

web集群-lvs-DR模式基本配置

目录 环境&#xff1a; 一、配置RS 1、安装常见软件 2、配置web服务 3、添加vip 4、arp抑制 二、配置LVS 1、添加vip 2、安装配置工具 3、配置DR 三、测试 四、脚本方式配置 1、LVS-DR 2、LVS-RS 环境&#xff1a; master lvs 192.168.80.161 no…

数据结构与算法4-冒泡排序

文章目录 1. 认识冒泡排序2. 图示2.1 图示12.2 图示2 3. 代码 1. 认识冒泡排序 双层for循环&#xff0c;每次选出最大的数“浮”到数组的最后面&#xff1b;时间复杂度O( n 2 n^2 n2)&#xff0c;空间复杂度O(1);重复地遍历待排序的数列&#xff0c;一次比较两个元素&#xff…

HCIP配置实验(路由配置)

要求&#xff1a; 1、R6为ISP&#xff0c;接口IP地址均为公有地址&#xff0c;该设备只能配置IP地址&#xff0c;之后不能冉对其进行任何配置; 2、R1-R5为局域网&#xff0c;私有IP地址192.168.1.0/24;请合理分配; 3、R1、R2、R4&#xff0c;各有两个环回IP地址; R5, R6各有一个…

小字辈[天梯赛]

文章目录 题目描述思路AC代码 题目描述 思路 深度优先搜索 具体流程 1.读入每个人的祖先&#xff0c;标记辈分最高的老祖宗对应的下标pos 2.从pos开始dfs&#xff0c;每次判断当前遍历的深度&#xff0c;如果>原来的深度&#xff0c;更新&#xff0c;并将存储最小辈分的数组…

【C语言】文件操作揭秘:C语言中文件的顺序读写、随机读写、判断文件结束和文件缓冲区详细解析【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本篇为【C语言】文件操作揭秘&#xff1a;C语言中文件的顺序读写、随机读写、判断文件结束和文件缓冲区详细解析【图文详解】&#xff0c;感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 前言 欢迎来到本篇博客&…

Linux编程4.9 网络编程-建立连接

1、TCP的连接与断开 三次握手与四次挥手 2、服务器端并发性处理 2.1 多进程模型 一个父进程&#xff0c;多个子进程父进程负责等待并接受客户端连接子进程: 完成通信&#xff0c;接受一个客户端连接&#xff0c;就创建一个子进程用于通信。 2.2 多线程模型 多线程服务器是…

Vue3+.NET6前后端分离式管理后台实战(四)

1&#xff0c;Vue3.NET6前后端分离式管理后台实战(四)已经发布&#xff0c; 程序源码已打包&#xff0c;感兴趣的可以关注下载。 2&#xff0c;源码打包可以下载&#xff1a;

整合qq邮箱发送

目录 &#x1f32e;1.获取qq授权码 &#x1fad3;2.引入依赖 &#x1f9c8;3.配置mail信息 &#x1f95e;4.创建实现类 &#x1f956;5.测试 1.获取qq授权码 点击开启服务&#xff0c;发送信息获取授权码 2.引入依赖 <!--邮件--><dependency><groupId&…

FL Studio for Mac 21.2.3.3586中文版的一些特点

FL Studio&#xff08;Fruity Loops&#xff09;是一款非常流行的数字音乐工作站软件&#xff0c;它可以让用户轻松地制作各种类型的音乐。前不久&#xff0c;FL Studio发布了最新的Mac版21.2.3.3586中文版&#xff0c;这个新版本的发布让广大Mac用户感到非常兴奋。本文将介绍F…

OSI(Open Systems Interconnection)网络架构模型简介

OSI&#xff08;Open Systems Interconnection&#xff09;参考模型是一种概念性的网络架构模型&#xff0c;它将计算机通信系统划分为7个层次&#xff0c;每个层次都有自己的功能和职责&#xff0c;通过相互合作来实现整个网络的通信。这7个层次分别是&#xff1a; 应用层&…

刷力扣看见一个寻找单身狗的问题?【力扣题解】

今天刷力扣遇到一道有意思的题目&#xff0c;题目是写着撞色问题177 &#xff0c;当我写完这个题去看看有什么好的解题方式的时候&#xff0c;看见一个有趣的题解问题&#xff0c;他对这个题目的描述是几对情侣&#xff0c;带几个单身狗出去玩&#xff0c;然后现在我们要把这几…

Android分区存储到底该怎么做

文章目录 一、Android存储结构二、什么是分区存储&#xff1f;三、私有目录和公有目录三、存储权限和分区存储有什么关系&#xff1f;四、我们应该该怎么做适配&#xff1f;4.1、利用File进行操作4.2、使用MediaStore操作数据库 一、Android存储结构 Android存储分为内部存储和…

AI算力池化赋能企业大模型价值探索

1. 大语言模型企业落地中的算力痛点 随着人工智能技术的飞速发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;成为了热门的研究领域之一。在这一领域中&#xff0c;大语言模型&#xff08;Large Language Models&#xff09;凭借其强大的语言理解和生成能力&#xff…

ArcGIS Pro、R与INVEST的多技术融合:生态系统服务权衡与协同研究的新纪元

生态系统服务是指生态系统所形成的用于维持人类赖以生存和发展的自然环境条件与效用&#xff0c;是人类直接或间接从生态系统中得到的各种惠益。联合国千年生态系统评估&#xff08;Millennium ecosystem assessment&#xff0c;MA&#xff09;提出生态系统服务包括供给、调节、…

突发!OpenAI服务异常!!!

2024/3/20傍晚7点&#xff0c;笔者的朋友在使用OpenAI时&#xff0c;页面提示服务异常&#xff0c;由此引发了我的深思&#xff1a;人工智能的脆弱性与未来的挑战 2024年3月20日&#xff0c;傍晚7点&#xff0c;一个普通的周二&#xff0c;我的朋友在尝试使用OpenAI时&#xf…

媒体发稿途径,怎么样去网络媒体投稿,媒体发布一般价格多少钱?

在信息爆炸的时代&#xff0c;媒体作为传递信息的重要渠道&#xff0c;成为企业推广的重要手段。然而&#xff0c;如何去网络媒体投稿&#xff0c;以及媒体发布的价格却是困扰很多企业和个人的问题。今天&#xff0c;我们将会为大家介绍一种简单易行的方式&#xff1a;媒介多多…

vue3 几种实现点击复制链接的方法

vue3 几种实现点击复制链接的方法 环境&#xff1a;vue3tselment plus 目的&#xff1a;常用到的地方就是点击复制分享链接功能 1.复制当前页面链接&#xff0c; <template><div class"news" style"margin-top: 30px"><el-button type&q…

事务同步管理器TransactionSynchronizationManager

事务同步管理器的使用场景&#xff1a; 同步涉及的资源包括&#xff1a;SqlSession & Connection。同步资源核心目的是线程共享&#xff0c;意味着必须跟线程绑定。同步资源伴随着线程生存或者消亡&#xff0c;意味着线程结束之前必须手动清除其绑定的资源。事务同步管理器…