第十四届蓝桥杯备赛模板题——蓝桥部队 (带权并查集)

news/2024/4/30 8:40:49/文章来源:https://blog.csdn.net/m0_57487901/article/details/127286301

目录

  • 1.蓝桥部队
    • 1. 问题描述
    • 2.输入格式
    • 3.输入样例
    • 4.样例答案
    • 5.原题连接
  • 2.解题思路
  • 3.Ac_code

1.蓝桥部队

1. 问题描述

小明是蓝桥部队的长官,他的班上有 NNN 名军人和 111 名军师。

这天,NNN 名军人在操场上站成一排,起初编号为 iii 的军人站在第 iii 列。

作为长官,小明可以对军人和军师下达 MMM 条命令,命令有两种类型,格式如下:

  • 1 x y,让军人 xxx 所在列的所有人作为一个整体移动到和军人 yyy 所在列的后面,使两列合并为一列。
  • 2 x y,询问军师军人 xxx 和军人 yyy 是否站在同一列。若是,则军师要回应小明 x,yx,yx,y 之间有多少人,否则军师要回应 −1-11
    你就是小明的军师,请你回答小明的每个询问。

2.输入格式

输入第 111 行包含两个正整数 N,MN,MN,M,分别表示军人的数量和小明的命令条数。
2∼M+12∼M+12M+1 行每行表示一条命令。
1≤N≤105,1≤M≤3×105,1≤x,y≤N。1 \leq N \leq 10 ^5,1≤M≤3×10^5,1≤x,y≤N。1N105,1M3×1051x,yN

3.输入样例

3 5
2 1 2
1 2 1
2 1 2
1 1 3
2 2 3

4.样例答案

-1
0
1

5.原题连接

蓝桥部队

2.解题思路

这是一道带权并查集的模板题,将 xxxyyy 合并到同一列和判断 xxxyyy 是否在同一个队列中,我们可以使用朴素的并查集维护。但是题意还要求我们求出在同一列中 xxxyyy 相距多远,这就是需要我们在使用并查集的同时维护额外的信息来帮助我们解答。使用使用数组d[]来维护每个点到其根节点的距离。如图:
在这里插入图片描述
1为根节点,可知 d[1]=0d[1]=0d[1]=0d[2]=1d[2]=1d[2]=1d[3]=2d[3]=2d[3]=2d[4]=3d[4]=3d[4]=3。当询问同一列里 xxxbbb 之间相差多少人 sss 时,可以得到计算公式:
s=abs(d[x]−d[y])−1s=abs(d[x]-d[y])-1s=abs(d[x]d[y])1
最开始每个点都是自己的根节点,所以d[]的初始化值全为 000
首先考虑并查集核心操作之一的合并操作:
在这里插入图片描述
当我们将队列1接到队列5时,此时队列5中的点d[]的值无需改变,需要修改的队列1,首先考虑 d[1]d[1]d[1] 会如何变化?因为1本身是根节点,所以d[x]d[x]d[x]的值为0,但当它接到队列5时,它就不是根节点了,那么d[1]d[1]d[1]的值应该更新为它到新祖宗的距离,也就是到节点5的距离,假设 size[x]size[x]size[x] 为点 xxx 所在列的元素个数,那么很明显d[1]d[1]d[1]的值应该更新为size[5]size[5]size[5],也就是它即将接上的列的元素个数。
那么队列1中其余元素的d[]值应该如何更改呢?此时d[2]、d[2]、d[3]d[2]、d[2]、d[3]d[2]d[2]d[3]表示的还都是指向1的距离,我们应该将其更新为到5的距离,那么只需要加上15的距离即可。也就是到新祖宗节点的距离等于到老祖宗节点的距离加上新祖宗节点到老祖宗节点的距离。
在合并的时候考虑到效率问题,我们只需要先修改祖宗节点即可,其余的值在路径压缩,也就是在查询祖宗节点时在更新。比如上图合并时我们主要将 d[1]d[1]d[1]的值修改即可,对于 234234234 我们先无需修改,再调用 find()find()find() 函数查询祖宗时再同时更新。
在这里插入图片描述
当路径压缩成功时,图将如上所示,指向根节点的值就是到根节点距离。详细的操作见代码讲解。

3.Ac_code

Java

import java.io.*;
import java.util.Arrays;public class Main {static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));static PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out));public static void main(String[] args) throws IOException {String[] s=br.readLine().split(" ");int n=Integer.parseInt(s[0]);int m=Integer.parseInt(s[1]);UF uf=new UF(n+10);for (int i = 0; i < m; i++) {s=br.readLine().split(" ");int op=Integer.parseInt(s[0]);int x=Integer.parseInt(s[1]);int y=Integer.parseInt(s[2]);if (op==1){uf.merge(y,x);}else{out.println(uf.dist(x,y));}}out.flush();}
}
//带权并查集模板,可复制使用
class UF {int[] f, d, siz;//构造函数初始化并查集public UF(int n) {f = new int[n];d = new int[n];siz = new int[n];for (int i = 1; i < n; ++i) {f[i] = i;}Arrays.fill(siz, 1);}//核心操作,再查询的时候同时更新d[x]的值int find(int x) {if (x == f[x]) return f[x];//先记录祖宗int root = find(f[x]);//加上父亲的距离d[x] += d[f[x]];//指向祖宗return f[x] = root;}boolean same(int x, int y) {return find(x) == find(y);}//让y列接在x列的后面。boolean merge(int x, int y) {x = find(x);y = find(y);if (x == y) return false;//本来d[y]等于0,现在它指向x的距离就是x的元素个数d[y] += siz[x];//此时x列的个数变多siz[x] += siz[y];f[y] = x;return true;}int size(int x) {return siz[find(x)];}//查询两点之间相差几个人,不在一列返回-1int dist(int x, int y) {if (!same(x, y)) return -1;return Math.abs(d[x] - d[y]) - 1;}
}

C++

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<int, int> PII;
#define pb(s) push_back(s);
#define SZ(s) (int)s.size();
#define ms(s,x) memset(s, x, sizeof(s))
#define all(s) s.begin(),s.end()
const int inf = 0x3f3f3f3f;
const int mod = 1000000007;
const int N = 200010;struct UF {std::vector<int> f, d, siz;UF(int n) : f(n), d(n, 0), siz(n, 1) { std::iota(f.begin(), f.end(), 0); }int find(int x) {if (x == f[x]) return f[x];//先记录祖宗int root = find(f[x]);//加上父亲的距离d[x] += d[f[x]];//指向祖宗return f[x] = root;}bool same(int x, int y) { return find(x) == find(y); }bool merge(int x, int y) {x = find(x);y = find(y);if (x == y) return false;d[y] += siz[x];siz[x] += siz[y];f[y] = x;return true;}int size(int x) { return siz[find(x)]; }int dist(int x, int y) {if (!same(x, y)) return -1;return abs(d[x] - d[y])-1;}
};
int n, m, op, x, y;
void solve()
{cin >> n>>m;UF uf(n + 10);for (int i = 1; i <= m; ++i){cin >> op >> x >> y;if (op == 1){uf.merge(y, x);} else {cout<<uf.dist(x,y)<<'\n';}}
}
int main()
{ios_base :: sync_with_stdio(false);cin.tie(nullptr);int t=1;while (t--){solve();}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JPA EntityManager 获取关联对象

今天尝试了几种方式&#xff0c;来获取关联对象。 关联对象&#xff0c;使用的 OneToMany(fetchFetchType.EAGER) 下面给一下总结&#xff1a; 一 Example 毫无疑问&#xff0c;很有信心&#xff0c;Example可以关联到对象。 事实也是这样。 但是Example好像只有and关系…

公众号网课题库系统-轻易获取查题接口

公众号网课题库系统-轻易获取查题接口 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点击…

Mindquantum实现变分量子奇异值分解

论文题目&#xff1a;Variational Quantum Singular Value Deposition(VQSVD) 项目介绍 复现过程 案例1&#xff1a;分解随机生成的8*8复数矩阵 先引入需要使用的包&#xff1a; import os os.environ[OMP_NUM_THREADS] 1​ import mindspore as ms from mindquantum impo…

Transformer解读之:Transformer 中的 Attention 机制

encoder 的 attention 场景&#xff1a;现在要训练的内容是 I love my dog -> 我喜欢我的狗那么在 encoder 端的输入是&#xff1a; I love my dog&#xff1b;假设经过 embedding 和位置编码后&#xff0c;I love my dog 这句话肯定已经变成了一个向量&#xff0c;但是在这…

一文彻底搞清Linux中块设备驱动的深层次原理和编写方法

【摘要】本文主要讲述了在Linux环境下的块设备驱动的常见数据结构和内核接口&#xff0c;并以一个实际例子讲述了块设备驱动的编写方法。 1.前提知识 一个块驱动提供对块存储设备&#xff08;比如 SD 卡、EMMC、NAND Flash、Nor Flash、SPI Flash、机械硬盘、固态硬盘等&…

Bed Bath Beyond EDI 856提前发货通知

自从1971年创业以来&#xff0c;Bed Bath&Beyond&#xff08;以下简称为BBB&#xff09;一直在为用户提供货真价实的卫浴用品&#xff0c;床上用品等家用商品。Bed Bath&Beyond 致力于成为一个勇于承担责任的公司团体&#xff0c;在市场建立起良好的信誉&#xff0c;提…

JavaSE 案例练习——精算师 double精度丢失解决思路

案例介绍 具体的内容是这样的&#xff1a; 编写一个程序&#xff0c;提示输入一个代表总钱数的双精度值&#xff0c;然后确定每种纸币和硬币需要的最少数量以达到输入的总钱数。 假设人民币种类如下&#xff1a;佰圆纸钞&#xff0c;伍拾圆纸钞&#xff0c;贰拾圆纸钞&#…

Asible最佳实践-进阶版-RHCA447 定义分组与变量

Asible最佳实践-进阶版-RHCA447 -------定义角组变量/主机变量/变量文件6.1 所有受管节点设置sudo免密[root@libin libin]# vim /etc/sudoers.d/devops libin ALL=(ALL) NOPASSWD:ALL [root@libin sudoers.d]# scp devops 192.168.124.134:`pwd` 6.2 自定义ansible目录[root@l…

学习使用jquery控制select下拉选项的字体样式

学习使用jquery控制select下拉选项的字体样式实现代码实现代码 <script src"../jquery-2.1.4.min.js"></script><style>div#container {padding: 30px;font-family: verdana, lucida;}a {color: #777;display: block;background-color: #ccc;widt…

向开发者开放免费注册!“远眺捷码”提供一站式软件快速开发平台

近日&#xff0c;远眺科技旗下具有自主知识产权的国产一站式软件快速开发平台——“远眺捷码”宣布正式开放免费注册&#xff0c;有各类软件应用开发等需求开发者、软件开发企业&#xff0c;可访问捷码官网https://www.gemcoder.com/ 操作步骤&#xff1a; Step1、打开捷码PC端…

客户成功 | 数据解码技能提升,Smartbi助力长沙烟草找到“新路子”

让数据会“说话”能“干活”&#xff0c;为客户挖掘出更深层的数据价值&#xff0c;是Smartbi一直以来助力企业数字化转型的目标和方向。大数据时代&#xff0c;每个科学的决策离不开数据的支撑&#xff0c;数字化精益管理是各行业提升自身运营管理的必然选择。数字化转型的成色…

实验1c语言开发环境使用和数据类型,运算符和表达式

1.试验任务1 (1)在垂直方向上打印两个字符小人的源代码,以及运行结果截图\\在垂直方向上打印两个字符小人#include<stdio.h> int main() {printf(" o\n");printf("<H>\n");printf("I I\n");printf("\n\n");printf(&quo…

【PMP学习笔记】第10章 项目沟通管理

【PMP学习笔记】第10章 项目沟通管理 什么是项目沟通管理? 让正确的信息在正确的时间通过正确的方式传递给正确的人,达到正确的效果。一、规划沟通管理规划沟通管理是基于每个相关方或相关方群体的信息需求、可用的组织资产,以及具体项目的需求,为项目沟通活动制定恰当的方…

基于SSM的网上餐厅管理系统

目 录 摘 要 I Abstract II 第一章 绪论 1 1.1研究背景及意义 1 1.2研究现状 1 1.3章节安排 2 第二章 相关技术说明 3 2.1 JSP(Java Server Page)简介 3 2.2 Spring框架简介 3 2.3 Spring MVC框架简介 5 2.4 MyBatis 框架简介 5 2.4 MySql数据库简介 6 2.5 Eclipse简介 6 2.6 T…

顺序表的实现

函数接口定义:顺序表描述的结构体为 typedef struct {ElemType *elem; //存储空间的基地址int length; //当前长度 } SqList;需要实现函数的接口分别为:int GetElem(SqList L, int i, ElemType &e) 顺序表的取值 判断i值是否合理,若不合理,返回0;[i-1]单元存储第i个数…

服务器开发26:Linux中线程和进程的联系与区别(游戏后端请和游戏思考10一起食用)

文章目录一、线程创建方法&#xff08;以redis举例&#xff09;1&#xff09;创建线程函数讲解2&#xff09;线程创建的标记二、内核中对线程的数据结构表示1&#xff09;task_struct具体定义2&#xff09;线程与进程的区别三、进程、线程创建过程及异同1&#xff09;进程创建(…

Oracle Form Builder 安装时遇到的问题记录

Oracle Form Builder 安装时遇到的问题记录 问题1&#xff1a;Checking operating system version: must be 5.0, 5.1 or 5.2. Actual 6.1 Checking operating system version: must be 5.0, 5.1 or 5.2. Actual 6.1 Failed <<<< 解决方法&#xff1a; 修改x:\ds…

JAVAEE多线程synchronized 优化过程

文章目录synchronized 优化过程一、锁升级/锁膨胀1. 偏向锁2. 轻量级锁3. 重量级锁二、锁消除三、锁粗化总结synchronized 优化过程 对于synchronized 1.既是乐观锁,也是悲观锁 2.既是轻量级锁,也是重量级锁 3.乐观锁的部分是基于自旋锁实现的,悲观锁的部分是基于挂起等待锁实…

springboot+jsp云课堂在线教育系统javaweb

“云课堂”在线教育系统是由高校学生依据兴趣爱好自愿组成&#xff0c;按照章程自主开展在线教育课程。“云课堂”在线教育系统是实施素质教育的重要途径和有效方式&#xff0c;在加强校园文化建设、提高学生综合素质、引导学生适应社会、促进学生成才就业等方面发挥着重要作用…

【23种设计模式】组合模式(Composite Pattern) .Net Core实现

文章目录需求变更我们应该怎么做?组合和单个对象是指什么呢?使用组合模式来设计菜单组合迭代器来源组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&…