【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++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干