集合问题(并查集)

news2024/10/7 10:13:12

本题链接:登录—专业IT笔试面试备考平台_牛客网

题目:

样例1:

输入
4 5 9
2 3 4 5

输出
YES
0 0 1 1

 样例2:

输入
3 3 4
1 2 4

输出
NO

思路:

        这道题关键点在于。

        当集合中有一个元素均存在于集合 A 和集合 B 的时候是 NO。

        并且 P_{i} 的范围是 1 ~ 1e9 所以,当 P_{i} >= max(a,b) 的时候也是 NO。

        我们同时可以指定一个 元素范围外的 一个元素作为 根元素集合 A,B

        其次,我们可以将 下标 作为对应的每一个元素,最后进行合并求结果即可。

代码详解如下:

#include <iostream>
#include <vector>
#include <unordered_map>
#define umap unordered_map
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;

umap<int,int>pos;	// 存储元素对应的下标

// 存储元素集合,至于为什么也用 umap ,由于 Pi 的数据范围上限是 1e9
// 我们要将数组无法开辟这么大,所以我们只能弄个映射 来存储对应的 A,B 根元素
umap<int,int>father;	

// 并查集查找函数
inline int Finds(int x)
{
	int t = x;	// 记录其实查找结点
	while(x != father[x]) x = father[x];	// 开始查找
	father[t] = x;	// 路径压缩查找
	return x;	// 返回结果
}

// 并查集合并操作
inline void Union(int a,int b)
{
	a = Finds(a),b = Finds(b);	// 查找对应根节点
	father[a] = b;	// 合并对应根节点
}

inline void solve()
{
	int n,a,b;
	cin >> n >> a >> b;
	int maxs = max(a,b);	// 获取对应 a b 最大值
	
	int A = maxs + 1;	// 根据对应的最大值,赋值一个元素范围外的元素作为 集合 A 的根节点
	int B = maxs + 2;	// 根据对应的最大值,赋值一个元素范围外的元素并且不同于集合A的根元素的元素作为 集合 B 的根节点
	father[A] = A,father[B] = B;	// 集合根节点初始化
	
	vector<int>v(n + 2,0);	// 存储对应元素
	for(int i = 1;i <= n;++i)
	{
		cin >> v[i];
		if(v[i] >= maxs)	// 如果存在 元素 大于 a 和 b ,那么放不了 任意集合,无解输出 NO
		{
			cout << "NO" << endl;
			return ;
		}
		pos[v[i]] = i;	// 映射对应的下标
		
		father[i] = i;	// 对应下标 根节点初始化
	}
	
	for(int i = 1;i <= n;++i)
	{
		// 如果对应的元素存在的话,我们将其元素的下标与当前的下标进行操作合并对应的集合
		
		if(pos[b - v[i]]) Union(i,pos[b - v[i]]);	// 另一元素存在 集合 b 那么我们合并对应下标 
		else Union(A,i);	//如果不符合那么合并另一个集合
		
		
		if(pos[a - v[i]]) Union(i,pos[a - v[i]]);	// 另一元素存在 集合 a 那么我们合并对应下标 
		else Union(B,i);	//如果不符合那么合并另一个集合
	}
	
	A = Finds(A),B = Finds(B);	// 根据对应的 结合 根节点元素查找;
	
	if(A == B) cout << "NO" << endl;	// 如果最终集合 A 和 集合 B 的根节点也给合并了,说明无解 NO
	else
	{
		cout << "YES" << endl;
		for(int i = 1;i <= n;++i)
		{
// 			cout << bool(Finds(i) == B) << ' ';		// 这样输出是错误的,有可能这里没考虑一个情况,就是 A == B 的时候,也有可能返回值的原因
			if(Finds(i) == A) cout << "0 ";
			else cout << "1 ";
		}
		cout << endl;
	}
}

signed main()
{
	IOS;
	int ___t = 1;
	while(___t--) solve();	
	return 0;
}

最后提交:

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

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

相关文章

(杂项笔记)腾讯文档设置隔行换色

文档小技巧 一、在表格工具栏中选择“数据”栏二、选择新建条件格式三、进行以下设置1. 应用范围2. 条件设置3. 这是表格颜色 四、样例展示1. 隔行换色2. 隔3行换色 最近在使用某家的文档进行多人协同办公&#xff0c;遇到的一些小技巧&#xff0c;在这里分享给大家&#xff1b…

无广告iOS获取设备UDID 简单方便快捷

ps&#xff1a; 为啥不用蒲公英了&#xff0c;就是因为有广告了&#xff0c;获取个UDID还安装游戏&#xff0c;真恶心?&#xff0c;所以找了新的获取UDID都方法&#xff0c;网页直接获取就可以&#xff0c;不会安装软件。 UDID 是一种 iOS 设备的特殊识别码。除序号之外&…

Java多线程--解决单例模式中的懒汉式的线程安全问题

文章目录 一、单例设计模式的线程安全问题&#xff08;1&#xff09;饿汉式没有线程安全问题&#xff08;2&#xff09;懒汉式线程安全问题1、案例2、方式1-同步方法3、方式2-同步代码块4、优化 二、代码&#xff08;1&#xff09;实现线程安全的懒汉式&#xff08;2&#xff0…

【力扣白嫖日记】SQL

前言 练习SQL语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1387.使用唯一标识码替代员工ID 表&#xff1a;Employees 列名类型idintnamevarchar 在 SQL 中&#xff0c…

k8s安装dashboard报错CrashLoopBackOff

报错信息 使用kubectl get pods -A查看集群&#xff0c;出现错误&#xff1a; kubernetes-dashboard kubernetes-dashboard-xxxxxxxxxx6-2qrst 0/1 CrashLoopBackOff 6 15m查看日志后&#xff0c;发现原因&#xff1a; panic: Get "https://10…

Pandas 数据结构 – Pandas CSV 文件

Pandas CSV 文件 CSV&#xff08;Comma-Separated Values&#xff0c;逗号分隔值&#xff0c;有时也称为字符分隔值&#xff0c;因为分隔字符也可以不是逗号&#xff09;&#xff0c;其文件以纯文本形式存储表格数据&#xff08;数字和文本&#xff09;。 CSV 是一种通用的、…

【IC设计】Windows下基于IDEA的Chisel环境安装教程(图文并茂)

Chisel环境安装教程 第一步 安装jdk&#xff0c;配置环境变量第二步 安装sbt&#xff0c;不用配置环境变量第三步 安装idea社区版第四步 离线安装scala的idea插件第五步 配置sbt换源1.切换目录2.创建repositories文件3.配置sbtconfig.txt文件 第六步 使用chisel-tutorial工程运…

Android矩阵setRectToRect裁剪Bitmap原图Matrix放大,mapRect标记中心区域,Kotlin

Android矩阵setRectToRect裁剪Bitmap原图Matrix放大&#xff0c;mapRect标记中心区域&#xff0c;Kotlin import android.content.Context import android.graphics.Bitmap import android.graphics.Canvas import android.graphics.Color import android.graphics.Matrix impo…

数学知识第八期 组合数全集

前言&#xff1a;组合数在高中大家应该都学过&#xff0c;也是一个重要的数学知识&#xff0c;希望大家能够完全掌握 一、组合数基本知识 定义&#xff1a; 组合是数学的重要概念之一。从 n 个不同元素中每次取出 m 个不同元素 &#xff0c;不管其顺序合成一组&#xff0c;称…

YIA主题如何关闭新版本升级提示?WordPress主题怎么取消升级提醒?

前两天YIA主题发布了升级到2.8版本&#xff0c;新增了一些功能&#xff0c;优化调整修复了一些功能&#xff0c;但是这些功能调整幅度不大&#xff0c;加上boke112百科使用的YIA主题已经进行了很多方面的个性化修改&#xff0c;所以就懒得升级了&#xff0c;但是每次进入WordPr…

C++——数据类型

C——数据类型 1.基本变量类型 C 基本数据类型整理成表格。以下是一个表格&#xff0c;展示了不同的基本数据类型及其一般用途和大小范围&#xff1a;和C语言类似。 2.宽字符的用法 #include <iostream> #include <locale> #include <wchar.h> int main…

Vue(二十):ElementUI 扩展实现表格组件的拖拽行

效果 源码 注意&#xff1a; 表格组件必须添加 row-key 属性&#xff0c;用来优化表格的渲染 <template><el-row :gutter"10"><el-col :span"12"><el-card class"card"><el-scrollbar><span>注意: 表格组件…

FreeRTOS_Stm32F407系列单片机标准库移植

这里写目录标题 1、下载FreeRTOS源码1.1github仓库下载1.2官网下载1.3百度网盘下载 2、FreeRTOS移植2.1首先需要有一个可运行的标准库工程2.2在工程内创建一个FreeRTOS文件夹&#xff0c;然后在FreeRTOS文件夹中再新建port、include、src三个文件夹。2.3 port文件夹移植2.4 inc…

Android使用ScrollView导致鼠标点击事件无效

平台 测试平台: RK3288 Android8.1RK3588 Android 12 问题 首先, 这个问题的前提是, 使用的输入设备是**鼠标**, 普通的触摸屏并不会出现这个问题. 大致的流程是APP的UI布局中采用ScrollView作为根容器, 之后添加各类子控件, 在一起准备就绪后, 使用鼠标进行功能测试, 出现…

AD24-固定孔放置

1、固定孔放置的一般距离&#xff0c;分为金属和非金属 2、固定孔通过焊盘完成&#xff0c;放置焊盘&#xff0c;并将层修改为Multi Layer 焊盘与固定孔的等大小的 3、金属与非金属的区别 ①非金属 ②金属 4、设置固定孔放置的距离 5、通过复制粘贴即可完成其他孔的放置 6、导…

时间序列预测模型实战案例(二)(Holt-Winter)(Python)结合K-折交叉验证进行时间序列预测实现企业级预测精度(包括运行代码以及代码讲解)

目录 引言 数据格式 运行代码 Holt-Winters模型主体 程序入口 参数讲解 开始训练 预测结果 引言 话不多说上来先上预测精度分析图,其中MAE的误差大概在0.11,以下数据均是预测未知数据&#xff0c;而不是训练数据的预测图。 开始之前我们先来简单了解一下Holt-Winters…

数据结构+算法(第02篇):玩扫雷就是优化算法

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

网安渗透攻击作业(2)

sql注入第一关 一、部署 1、环境安装 &#xff08;1&#xff09;下载phpstudy&#xff0c;下载链接&#xff1a;小皮面板(phpstudy) - 让天下没有难配的服务器环境&#xff01; &#xff0c;安装过后打开软件进入如下界面&#xff0c;接着我们开启nginx和mysql 注意&#x…

Linux--Shell基础

学习笔记&#xff0c;记录以下课程中关于Linux的Shell基础知识。 黑马程序员linux入门到精通&#xff08;下部分&#xff09;_哔哩哔哩_bilibili 目录 1.编写规范 2.变量 2.1 变量的含义 2.2 变量的定义和使用 2.3 只读变量&#xff08;了解&#xff09; 2.4 接收用户输入…

Linux 命令 —— top

Linux 命令 —— top 相对于 ps 是选取一个时间点的进程状态&#xff0c;top 则可以持续检测进程运行的状态。使用方式如下&#xff1a; 用法&#xff1a; top [-d secs] | [-p pid] 选项与参数&#xff1a; -d secs&#xff1a;整个进程界面更新 secs 秒。默认是 5 5 5 秒。…