【C++】有N种颜色的小球,开始同一种颜色小球装在同一个筐里面,颜色从1到N标号。有下面两个操作(Cab),把颜色是b的 (源码)【独一无二】

本文主要是介绍【C++】有N种颜色的小球,开始同一种颜色小球装在同一个筐里面,颜色从1到N标号。有下面两个操作(Cab),把颜色是b的 (源码)【独一无二】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

请添加图片描述


👉博__主👈:米码收割机
👉技__能👈:C++/Python语言
👉公众号👈:测试开发自动化【获取源码+商业合作】
👉荣__誉👈:阿里云博客专家博主、51CTO技术博主
👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。


C++实现 并查集实现颜色球归类和查询操作


目录

  • C++实现 并查集实现颜色球归类和查询操作
  • 一、题目要求
  • 二、设计思路
      • 数据结构设计
      • 功能实现
      • 性能优化
  • 三、代码展示


一、题目要求

有N种颜色的小球,开始同一种颜色小球装在同一个筐里面,颜色从1到N标号。有下面两个操作(Cab),把颜色是b的球所在筐中的球都倒进颜色是a的球所在的筐。(Qc),查询颜色是c的球所在的筐中,哪种颜色的球最多,哪种颜色的球最少,输出球的个数

输入格式
第一行两个正整数N、M。M表示一共有M个操作。(1<=N、M<=100000)。第二行是N个由空格隔开的正整数,第i个数表示颜色为i的球有ai个,ai在int范围内。接下来的M行,对应M个操作。
输出格式
对于每个查询输出一行,每行两个正整数,第一个为最大值,第二个为最小值。

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 归类查询” 获取。👈👈👈

样例一input


6 6
1 2 3 4 5 6
C 1 2
C 3 4
C 5 6
C 1 3
C 1 5
Q 1

outout:

6 1

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 归类查询” 获取。👈👈👈

二、设计思路

设计基于并查集数据结构,用以高效处理“合并”和“查询”操作。

数据结构设计

  1. 并查集(Union-Find)结构:主要用于管理和追踪每种颜色球的归属,每个筐通过一个领导者(即并查集中的根节点)来标识。
    • parent 数组:用于表示每个节点的父节点,若 parent[x] == x,则 x 是根节点。
    • size 数组:记录每个根节点所代表的集合的大小,用于在合并时优化树的高度,以保持树的平衡,从而加速查询操作。
    • colorCount 向量:这是一个向量,其中的每个元素都是一个哈希表(unordered_map),用于存储该根节点集合中不同颜色球的数量。

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 归类查询” 获取。👈👈👈

功能实现

  1. 初始化

    • 使用 initialCount 数组初始化 colorCount,这个数组记录了每种颜色球的初始数量。
    • 初始时,每种颜色的球自成一组,其根节点即其自身,且每个筐只包含一种颜色的球。
  2. 合并操作(unionSet

    • 查找两个颜色所在集合的根节点。
    • 如果根节点不同,将一个集合合并到另一个集合。为了保持树的平衡,通常将较小的集合合并到较大的集合中(基于 size 数组)。
    • 更新根节点的 colorCount 哈希表,将被合并集合的颜色球数量加到目标集合的对应颜色上。
  3. 查询操作(query

    • 查找指定颜色所在的集合的根节点。
    • 遍历根节点的 colorCount 哈希表,找到数量最多和最少的球,输出这两个值。

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 归类查询” 获取。👈👈👈

性能优化

  • 路径压缩:在查找操作中使用路径压缩技术,使得每个节点直接或间接指向根节点,减少后续查找的深度。
  • 按秩合并:通过比较集合的大小(利用 size 数组),总是将较小的集合合并到较大的集合,这有助于保持并查集树的平衡,提高效率。

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 归类查询” 获取。👈👈👈


三、代码展示

#include <iostream>
#include <vector>
#include <unordered_map>using namespace std;struct UnionFind {vector<int> parent;vector<int> size;// 代码略....>👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 归类查询” 获取。👈👈👈// 代码略....// 代码略....int find(int x) {if (parent[x] != x) {parent[x] = find(parent[x]);}return parent[x];}void unionSet(int x, int y) {int rootX = find(x);int rootY = find(y);if (rootX != rootY) {if (size[rootX] < size[rootY]) {swap(rootX, rootY);}parent[rootY] = rootX;size[rootX] += size[rootY];for (auto& p : colorCount[rootY]) {colorCount[rootX][p.first] += p.second;}}}// 代码略....// 代码略....// 代码略....};int main() {// 代码略.... >👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 归类查询” 获取。👈👈👈// 代码略....// 代码略....int N, M;cin >> N >> M;vector<int> initialCount(N);for (int i = 0; i < N; ++i) {cin >> initialCount[i];}// 代码略....// 代码略....// 代码略....return 0;
}

运行结果:

加粗样式

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 归类查询” 获取。👈👈👈

这篇关于【C++】有N种颜色的小球,开始同一种颜色小球装在同一个筐里面,颜色从1到N标号。有下面两个操作(Cab),把颜色是b的 (源码)【独一无二】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/959928

相关文章

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的