[并查集] UVA11987 Almost Union-Find

embedded/2025/2/7 2:52:59/

问题描述

n n n 个集合, m m m 次操作。规定第 i i i 个集合里初始只有 i i i
有三种操作:

  1. 输入两个元素 p p p q q q ,若 p p p q q q 不在一个集合中,合并两个元素的集合。
  2. 输入两个元素 p p p q q q ,若 p p p q q q 不在一个集合中,把 p p p 添加到 q q q 所在的集合。
  3. 输入一个元素 p p p ,查询 p p p 所在集合的元素个数和所有元素之和。

输入格式

本题有多组数据。
对于每组数据:

第一行输入 n n n m m m 两个整数。
接下来 m m m 行,每行第一个数 k k k 代表选择哪一个命令,若 k k k 1 1 1 2 2 2 命令,则再输入两个整数 p p p q q q 。若 k k k 3 3 3,则输入一个整数 p p p

输出格式

输出行数为 3 3 3 号命令的总数。
每一行输出两个整数 a a a b b b,即元素个数和元素和。

样例

样例输入1:

5 7
1 1 2
2 3 4
1 3 5
3 4
2 4 1
3 4
3 3
5 7
1 1 2
2 3 4
1 3 5
3 4
2 4 1
3 4
3 3

样例输出1:

3 12
3 7
2 8
3 12
3 7
2 8

数据范围

对于所有数据, 1 ≤ n , m ≤ 1 0 5 , 1 ≤ p , q ≤ n 1 \le n, m \le 10^5, 1\le p, q \le n 1n,m105,1p,qn

题解

使用并查集进行维护, 1 1 1 3 3 3 操作都是普通的并查集操作, 2 2 2 操作需要维护删除操作。

删除:对于每个点,将代表记为虚拟的点,并记录每个点对应虚拟点的位置。这样删除就可以直接从以前的并查集中操作,再进行创建新的点了。

int u[200010];
int siz[200010], sum[200010];//大小,和
int bh[200010];//每个点对应现有的编号
int get_father(int x){//查找(路径压缩)……
}
int main(){while(scanf("%d %d", &n, &m) != EOF){清空 siz, summ, uint cnt = n;//初始化for(int i = 1; i <= n; ++ i){u[i] = i;siz[i] = 1;sum[i] = i;bh[i] = i;}for(int i = 1; i <= m; ++ i){int x, y, z;scanf("%d", &x);if(x == 1){//普通的合并scanf("%d %d", &y, &z);int t1 = get_father(bh[y]), t2 = get_father(bh[z]);if(t1 == t2){continue;}u[t1] = t2;siz[t2] += siz[t1];sum[t2] += sum[t1];}else if(x == 2){scanf("%d %d", &y, &z);int t1 = get_father(bh[y]), t2 = get_father(bh[z]);if(t1 == t2){continue;}//从前一个集合删除siz[t1] --;sum[t1] -= y;//新建虚拟点,并指向 t2++ cnt;u[cnt] = t2;siz[cnt] = 1;sum[cnt] = y;siz[t2] ++;sum[t2] += y;bh[y] = cnt;//记录对应集合}else{scanf("%d", &y);printf("%d %d\n", siz[get_father(bh[y])], sum[get_father(bh[y])]);}}}return 0;
}

http://www.ppmy.cn/embedded/144192.html

相关文章

修复docker启动失败:Failed to start Docker Application Container Engine

配置了镜像源之后&#xff0c;运行sudo systemctl restart docker.service失败&#xff0c;提示让运行systemctl status docker.service或journalctl -xeu docker.service查看详细信息。 运行后者发现有如下日志&#xff1a; 红色区域是我设置的一个镜像源这个日志的意思就是…

【电子通识】案例:USB Type-C USB 3.0线缆做直通连接器TX/RX反向

【电子通识】案例:连接器接线顺序评估为什么新人总是评估不到位?-CSDN博客这个文章的后续。最近在做一个工装项目,需要用到USB Type-C线缆做连接。 此前已经做好了线序规划,结果新人做成实物后发现有的USB Type-C线缆可用,有的不行。其中发现USB3.0的TX-RX信号与自己的板卡…

Spring Cloud Alibaba:一站式微服务解决方案

一、简介 Spring Cloud Alibaba&#xff08;简称SCA&#xff09; 是一个基于 Spring Cloud 构建的开源微服务框架&#xff0c;专为解决分布式系统中的服务治理、配置管理、服务发现、消息总线等问题而设计。它集成了阿里巴巴开源的各种分布式服务技术&#xff0c;提供了一系列…

开发指南084-名册的实现

平台中很多应用都有类似的需求&#xff0c;以人力资源系统为例&#xff0c;需要出下面的表格&#xff1a; 部门 人员列表 A部门 A1,A2,A3 B部门 B1,B2,B3 ... 它的主要特点是实现分组行转列。传统的方法就是把数据取过来&#xff0c;一行一行拼接。随着数据库的发展…

16 设计模式之适配器模式(充电器转换案例)

一、适配器模式的定义 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;常用于解决接口不兼容的问题。适配器模式通过引入一个“适配器”类&#xff0c;将一个接口转化为客户端期望的另一种接口&#xff0c;使得原本因接口不兼容而无法交互…

多模态大型语言模型MM-1.5采用数据驱动的方法,通过不断优化数据组合提高模型性能

多模态大型语言模型MM-1.5采用数据驱动的方法&#xff0c;通过不断优化数据组合提高模型性能 MM-1.5模型的设计核心在于其数据驱动的方法&#xff0c;这意味着模型的性能在很大程度上取决于所使用的数据类型和组合。这种方法的实施细节可以从以下几个方面来展开&#xff1a; …

Scala的正则表达式

应用场景 1.找到符合要求的子串 2.判断给的字符串是否符合要求 例如&#xff0c;在网站上注册用户&#xff0c;用户名的格式有要求&#xff01;

【JavaWeb后端学习笔记】Spring事务管理

Spring事务管理 1、事务管理2、事务管理使用场景3、Transactional注解属性3.1 rollbackFor3.2 propagation 1、事务管理 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么…