思路:并查集:
维护f【i】数组,代表读到数字i,i可以变成的第一个合法的数字
如果f[i]==i,表示i还没有出现过,可以使用i,同时更新f[i]=Find(f[i+1])
代码:
#include<iostream>
using namespace std;
const int N = 100005;
int n;
int a;
int f[N];
int trans[N];
int Find(int x)
{
if(x==f[x]) return x;
return f[x]=Find(f[x]);
}
int main()
{
cin>>n;
for(int i=0;i<N;++i) f[i]=i;
for(int i=1;i<=n;++i)
{
cin>>a;
int ne=Find(a);
cout<<ne<<" ";
f[ne]=Find(ne+1);
}
return 0;
}