题目大概意思就是给一串数,我们需要遍历每个数,如果该数在之前出现过,就加一,一直加一,直到加到这个数变成之前没出现过的数,我们需要输出改变之后的数组
代码及注释如下
#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;
}
这道题里面重点是理解父节点在这道题的意义,就是下一个重复数出现时应该变成的数