通常来说,并查集用来维护具有传递性质关系的集合,对于本题,可以巧妙使用并查集的地方在于:利用路径压缩,查找到还未使用的第一个数,例如 , 2已经被使用了,其父亲为4,4的父亲为100....可以实现高效率的查找。
#include<iostream>
#include<unordered_map>
#include<cstdio>
using namespace std;
const int N = 5e5 + 10;
unordered_map<int ,int > fa;
int find(int x)
{
if(fa[x] == 0) return x;
else fa[x] = find(fa[x]);
return fa[x];
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int x;
scanf("%d",&x);
x = find(x);
printf("%d ",x);
fa[x] = x + 1;
}
return 0;
}