【POJ No. 1988】 方块栈 Cube Stacking

news2024/11/24 14:46:50

【POJ No. 1988】 方块栈 Cube Stacking

POJ 题目地址

在这里插入图片描述

【题意】

贝西正在玩方块游戏,方块编号为1~N(1≤N ≤30,000),开始时每个方块都相当于一个栈。

贝西执行P 个(1≤P ≤100,000)操作,操作类型有两种:M X Y ,将包含X 的栈整体移动到包含Y 的栈顶部;C X ,查询X 方块下的方块数量。请统计贝西每个操作的结果。

【输入输出】

输入:

第1行为单个整数P ,表示操作的数量。第2~P +1行:每一行都描述一个操作(注意:N 的值不会出现在输入文件中,没有一种移动操作会请求将栈移动到自身)。

输出:

对每个C操作,都输出统计结果。

【样例】

在这里插入图片描述

【思路分析】

这道题包括移动和计数两种操作,方块的整体移动可以使用二维数组实现,但是操作数量很大,若一个一个地移动,则会超时。

整体移动相当于集合的合并,因此可以借助并查集实现,在集合查找和合并时,更新树根下方的方块数量即可。使用并查集可以快速、高效地解决该问题。

【算法设计】

① 初始化。初始化每个方块的集合号都为其自身。

② 查询或者合并。

  • C X :查询X 的集合号,并输出X 方块下的方块数量。d [i ]表示第i 个方块下的方块数量。查询X 的祖宗,在返回过程中将经过路径上节点的集合号统一为祖宗的集合号,将当前节点的d 值加上其父节点的d 值。
  • M X Y :合并X 、Y 集合号。cnt[i ]表示第i 个栈的方块数量。首先找到X 、Y 所在的集合祖宗a 、b ,然后将a 的集合号修改为b ,fa[a ]=b ,更新d [a ]=cnt[b ],cnt[b ]+=cnt[a ]。

【举个栗子】

① 初始化。根据输入样例,初始时每个方块的集合号都为其自身,fa[i ]=i ;在每个方块下都有0个方块,d [i ]=0;每个栈只有1个方块,cnt[i ]=1。

② 合并。M 1 6:将包含1的栈整体移动到包含6的栈。首先找到1和6的祖宗1、6,然后将1的集合号修改为6,fa[1]=6,更新d[1]=cnt[6]=1,cnt[6]+=cnt[1]=2。

在这里插入图片描述

③ 查询。C 1:查询1下面有多少个方块。首先查询1的集合号,找祖宗,在查询过程中将当前节点的d 值加上其父节点的d 值,d[1]+=d [6]=1。

④ 合并。M 2 4:将包含2的栈整体移动到包含4的栈。首先找到2和4的祖宗2、4,然后将2的集合号修改为4,fa[2]=4,更新d[2]=cnt[4]=1,cnt[4]+=cnt[2]=2。

在这里插入图片描述

⑤ 合并。M 2 6:将包含2的栈整体移动到包含6的栈。首先找到2和6的祖宗4、6,然后将4的集合号修改为6,fa[4]=6,更新d[4]=cnt[6]=2,cnt[6]+=cnt[4]=4

注意:只修改祖宗集合号,2号方块的集合号及d 值并没有修改,下次查询2的集合号时才会更新。这正是并查集的妙处。

在这里插入图片描述

⑥ 查询。C 3:查询3下面有多少个方块。首先查询到3的集合号为3,d [3]=0。

⑦ 查询。C 4:查询4下面有多少个方块。首先查询4的集合号,在查询过程中将当前节点的集合号修改为其父节点的集合号,将当前节点的d 值加上其父节点的d 值,d [4]+=d [6]=2。

⑧ 若继续查询C 2,则查询2下面有多少个方块。先查询2的祖宗,在返回过程中将当前节点的d 值加上其父节点的d 值,d [2]+=d[4]=3。

在这里插入图片描述

【算法实现】

① 初始化。

void Init(){
	for(int i = 1;  i < N ; i ++){
		fa[i] = i; //每个方块的集合号 都为其自身
		d[i] = 0; //第i 个节点下方的方块数量 为0
		cnt[i] = 1; //第 i个栈 的方块数量为 1
	}
}

② 查询。查询x 的集合号,集合号等于自身时停止。在返回过程中,将经过路径上节点的集合号都统一为祖宗的集合号,将当前节点的d 值加上其父节点的d 值。

int Find(int x){
	int fx = fa[x];
	if(x != fa[x]){
		fa[x] = Find(fa[x]);
		d[x] += d[fx];
	}
	return fa[x];
}

③ 合并。首先找到x、y 所在的集合祖宗a 、b ,然后将a 的集合号修改为b ,更新d [a ]=cnt[b ],cnt[b ]+=cnt[a ]。

void Union(int x, int y){
	int a , b;
	a = Find(x);
	b = Find(y);
	
	fa[a] = b;
	d[a] = cnt[b];
	cnt[b] += cnt[a];
}

[解决]

#include<cstdio>
#include<cstring>

using namespace std;

#define N 30010

int n , fa[N] , d[N] , cnt[N];

void Init(){
	for(int i = 1;  i < N ; i ++){
		fa[i] = i; //每个方块的集合号 都为其自身
		d[i] = 0; //第i 个节点下方的方块数量 为0
		cnt[i] = 1; //第 i个栈 的方块数量为 1
	}
}

int Find(int x){
	int fx = fa[x];
	if(x != fa[x]){
		fa[x] = Find(fa[x]);
		d[x] += d[fx];
	}
	return fa[x];
}

void Union(int x, int y){
	int a , b;
	a = Find(x);
	b = Find(y);
	
	fa[a] = b;
	d[a] = cnt[b];
	cnt[b] += cnt[a];
}

int main(){
	
	char op[3];
	
	int i , j;
	while(~scanf("%d" , &n)){
		
		Init();
		while(n --){
			
			scanf("%s", op);
			if(op[0] == 'C'){
				
				scanf("%d" , &i);
				int fi = Find(i);
				printf("%d\n" , d[i]);
			}
			else{
				
				scanf("%d%d" ,&i , &j);
				Union(i , j);
			}
		}
	}
	
	return 0;
}

在这里插入图片描述

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

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

相关文章

深圳市数字经济指数发布:数字经济蓬勃发展,数字用户深度渗透

2022年1月&#xff0c;国务院印发了《“十四五”数字经济发展规划》。规划提出&#xff0c;到2025年&#xff0c;数字经济核心产业增加值占国内生产总值比重达到10%&#xff0c;数据要素市场体系初步建立&#xff0c;产业数字化转型迈上新台阶&#xff0c;数字产业化水平显著提…

【论文精读4】MVSNet系列论文详解-CVP-MVSNet

CVP-MVSNet全文名为“Cost Volume Pyramid Based Depth Inference for Multi-View Stereo”&#xff0c;主要创新点在于使用由粗到细&#xff08;coarse-to-fine&#xff09;模式来构建代价体金字塔&#xff08;cost volume pyramid&#xff09;&#xff0c;流程如下&#xff1…

Java虚拟机之运行时数据区(一)

Java虚拟机之运行时数据区 简述 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途&#xff0c;以及创建和销毁的时间&#xff0c;有的区域随着虚拟机进行启动而一直存在&#xff0c;有些区域则是依赖用户线程的启动和结…

房子装修有哪些注意事项要注意?

房子装修有哪些注意事项要注意&#xff1f;这里的东西太多了&#xff0c;可能三天三夜都搞不清楚&#xff0c;而且对于初次装修的业主来说&#xff0c;很多专业术语都是一头雾水&#xff0c;所以本文就简单介绍一下&#xff0c;从装修到装修&#xff0c;以及需要注意的几点。 房…

【深度学习】实验4答案:脑部 MRI 图像分割

DL_class 学堂在线《深度学习》实验课代码报告&#xff08;其中实验1和实验6有配套PPT&#xff09;&#xff0c;授课老师为胡晓林老师。课程链接&#xff1a;https://www.xuetangx.com/training/DP080910033751/619488?channeli.area.manual_search。 持续更新中。 所有代码…

数据之道读书笔记-05面向“联接共享”的数据底座建设

数据之道读书笔记-05面向“联接共享”的数据底座建设 在从信息化向数字化转型的过程中&#xff0c;企业积累了海量的数据&#xff0c;并且还在爆发式地增长。数据很多&#xff0c;但真正能产生价值的数据却很少。数据普遍存在分散、不拉通的问题&#xff0c;缺乏统一的定义和架…

[发送AT指令配置a7670C模块上网]

发送AT指令配置a7670C模块上网内核配置调试验证应用的编写AT的指令的使用内核配置 概要&#xff1a;基于rv1126平台调试SIMCOM 7670C 4G模块。 1&#xff0c;内核配置及内核代码修改 1.1按照芯片data sheet修改kernel代码&#xff0c;添加PID和VID。 此处根据不同的芯片按照其…

Mybatis plus注解@TableField详解

Mybatis plus注解TableField详解 目录1. 前言2. 应用场景2.1 更新null值2.2 查询时排除字段2.3 非数据库字段属性1. 前言 TableField 字段注解&#xff0c;该注解用于标识非主键的字段。将数据库列与 JavaBean 中的属性进行映射。 2. 应用场景 2.1 更新null值 想要在更新字…

auth模块方法的使用

文章目录1、创建超级用户(管理员)2、获取表&#xff0c;检验密码3、保存用户状态4、获取用户对象&#xff0c;校验用户是否登录5、验证用户是否登录6、修改密码7、注销8、注册9、方法总结10、如何扩展auth_user表1、创建超级用户(管理员) """ 在创建好一个djan…

医保医用耗材编码目录——在线查询

医保医用耗材编码目录是按照“统一分类、统一编码、统一维护、统一发布、统一管理”的总体要求下进行更新维护&#xff0c;旨在强调“分类”与“追溯”属性&#xff0c;助力将医保编码标准统一为新时期医保信息交换的通用语言。 对于医保医用耗材分类与代码数据的“分类”与“追…

高数 | 【数一】 多元函数积分学 —— 总复习框架总结

自用复习笔记。 整理参考于 2023张宇高数18讲、武忠祥十七堂课。 三重积分(质量) 概念与对称性计算 直角坐标系 先一后二法/先z后xy法/投影穿线法(柱体,侧面为柱体)先二后一法/先xy后z法/定限截面法(旋转体)柱面坐标系 = 极坐标下二重积分与定积分球面坐标系 应用 体积总…

开源版禅道的使用教程

文章目录一、禅道简介二、下载安装三、敏捷版基本功能使用四、其他版本使用一、禅道简介 1.官网介绍&#xff1a;国产开源项目管理软件。核心管理思想基于敏捷方法scrum。集产品管理、项目管理、质量管理、文档管理、组织管理和事务管理于一体。 scrum&#xff1a;迭代式增量软…

DHCP地址池耗尽攻击

DHCP地址池耗尽攻击 攻击原理简介 ​ 路由器内置的DHCP服务器&#xff0c;划定了一个地址池作为自动分配给接入终端号IP地址的范围。 ​ 攻击工具伪装成大量的接入主机&#xff0c;向路由器内的DHCP服务器请求大量的IP地址分配。 ​ 在DHCP的地址租期超时之前&#xff0c;已经分…

CentOS 7搭建Yunzai-Bot原神机器人

CentOS 7.6搭建Yunzai-Bot原神机器人 前言 目前使用较多的原神机器人&#xff1a; LittlePaimon ✨基于NoneBot2和go-cqhttp的原神Q群机器人 原神多功能机器人&#xff0c;查询游戏信息、图鉴攻略、树脂提醒等等&#xff0c;以及各种各样的好玩的功能&#xff0c;不仅仅是原神…

行业案例 | 睿眼攻击溯源组合拳让黑客攻击事件无所遁形

项目背景 近年来,网络安全形势愈发严峻&#xff0c;黑客入侵、信息泄露等信息安全事件层出不穷&#xff0c;给企业带来了巨大的经济损失。一是互联网出口应用多为Web应用&#xff0c;有效防护和监测Web应用的安全性是金融行业客户信息安全领域的一项重点工作&#xff1b;二是随…

C++11 lambda+包装器+可变参数模板

索引lambda表达式(1).什么是lambda(2).lambda基本规则(3).lambda实现原理包装器可变参数模板lambda表达式 (1).什么是lambda 假设有这样一个类 struct Goods { string _name; // 名字 double _price; // 价格 int _evaluate; // 评价 }&#xff1b;现在要将商品分别按照名字…

“健康中国”战略下如何推进公共卫生建设,海尔生物医疗给出“智慧答案”

【潮汐商业评论/原创】 公共卫生是一个老话题&#xff0c;但在新时代的背景下正在呈现出诸多新故事。在人民健康需求日益提升的当下&#xff0c;推动公共卫生服务体系的高效、便捷升级成了新时期的一大命题&#xff0c;而这一问题的答案则指向了公共卫生需要“数智化”。 在此…

Python之第十章 IO及对象列化

目录 Python之第十章 IO及对象列化 1.IO流&#xff08;IO stream&#xff09; 1.概述 2.IO流定义 3.流的分类 2.open方法 1.过程 2.缓冲区&#xff08;buffer&#xff09; 使用缓存区的必要性&#xff1a; 缓冲区分类&#xff1a; 3.格式 4.b模式 5.模式 6.文件对…

CentOS 7搭建LittlePaimon原神机器人

CentOS 7.6搭建LittlePaimon原神机器人 前言 最近小伙伴说别人的QQ群里有个原神的机器人&#xff0c;可以随时查询自己账号的角色卡信息。然后我自己查了下资料&#xff0c;发现不是很难弄&#xff0c;所以帮忙也弄了一个。 目前使用较多的原神机器人&#xff1a; LittlePaim…

SpringMVC学习篇(八)

SpringMVC拦截器 1.拦截器和过滤器的区别 过滤器拦截器servlet规范中(java ee)规范中的一部分,任何java web工程都可以使用拦截器是框架提供的,如只有在SpringMVC框架下的工程才能使用其提供的拦截器在url-pattern中配置了/*之后,可以拦截任何一切资源拦截器只会拦截控制器方…