【POJ1988】Cube Stacking(并查集水题)

这篇博客介绍了如何利用并查集解决POJ1988 Cube Stacking的题目。文章详细解析了move和count操作,并提出用Under[]记录立方体底下的方块数,用Up[]记录每个立方体到堆顶的距离。通过在并查集中更新Under[]和Up[],可以高效地求解问题,代码实现简洁明了。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题面:【POJ1988】Cube Stacking

题意:

有n个编号分别为1~n的立方体以及两种操作,一种是move操作,一种是count操作。move操作就是让你把含x的一堆立方体移到含y的一堆立方体的上面,count操作就是让你求出编号为x的立方体底下有几个立方体。

解析:

一看到这道题,很容易就能想到用并查集来做,而这道题也的确是用并查集来做的O(∩_∩)O~

首先,我们先来考虑move操作。当你要把两堆立方体堆在一起时,可以把底下那堆的堆顶的father更新为上面那堆的堆顶,这应该是很容易想到的。

那么,应该如何求出编号为x的立方体底下的方块数呢?

我们可以用Under[x]来记录编号为x的立方体底下有多少个方块,这样,输出时只要输出Under[x]即可。

可是我们不可能持续更新Under[x],这样的复杂度太大了,因此,我们可以用一个Up[]数组来记录每个立方体到它所在的那堆立方体的堆顶的距离,这样只要持续更新每一堆的堆顶的Under[]值即可。

而这一步只需在合并时就能顺便完成了,几乎无需任何复杂度。

并且,Up[]数组的更新也是非常容易的,只需在并查集函数getfa()中加一句Up[x]+=Up[f[x]]即可。

这样一来,就可以发现Under[x]=Under[getfa(x)]-Up[x],因此输出时只要输出Under[getfa(x)]-Up[x]就可以了。

代码如下:

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
#define max(x,y
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值