P8686 [蓝桥杯 2019 省 A] 修改数组(并查集)

题目大概意思就是给一串数,我们需要遍历每个数,如果该数在之前出现过,就加一,一直加一,直到加到这个数变成之前没出现过的数,我们需要输出改变之后的数组 

代码及注释如下

#include<iostream>
using namespace std;
const int maxn = 1e5+520;
int n,a,fa[maxn];
int find(int x)//查找父节点模板,
{				//*****在这道题里面父节点指的其实就是下一个重复数x出现时,应该变为的数*****
	if (x == fa[x]) return x;//如果fa[x]==x,说明这个就是父节点
	fa[x] = find(fa[x]);//如果fa[x]!=x,就继续查找父节点的父节点,并路径压缩,改变当前节点的父节点
	return fa[x];//得到了父节点
}
int main()
{
	cin >> n;
	for(int i=1;i<maxn;i++)
		fa[i] = i;//初始化父节点
	for (int i = 1; i <= n; i++)
	{
		cin >> a;
		a = find(a);
		fa[a]++;//每次输入后都需要改变父节点
		cout << a << ' ';
	}

	return 0;
}

这道题里面重点是理解父节点在这道题的意义,就是下一个重复数出现时应该变成的数 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值