题目描述
给定一个长度为 NN 的数组 A = [A_1,A_2,··· ,A_N]A=[A1,A2,⋅⋅⋅,AN],数组中有可能有重复出现的整数。
现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改A_2,A_3,··· ,A_NA2,A3,⋅⋅⋅,AN。
当修改 A_iAi 时,小明会检查 A_iAi 是否在 A_1A1 ∼ A_i−1Ai−1 中出现过。如果出现过,则小明会给 A_iAi 加上 1 ;如果新的 A_iAi 仍在之前出现过,小明会持续给 A_iAi 加 1 ,直 到 A_iAi 没有在 A_1A1 ∼ A_i−1Ai−1 中出现过。
当 A_NAN 也经过上述修改之后,显然 AA 数组中就没有重复的整数了。
现在给定初始的 AA 数组,请你计算出最终的 AA 数组。
输入描述
第一行包含一个整数 NN。
第二行包含 NN 个整数 A_1,A_2,··· ,A_NA1,A2,⋅⋅⋅,AN。
其中,1 \leq N \leq 10^5,1 \leq A_i \leq 10^61≤N≤105,1≤Ai≤106。
输出描述
输出 NN 个整数,依次是最终的 A_1,A_2,··· ,A_NA1,A2,⋅⋅⋅,AN。
输入输出样例
示例
输入
5
2 1 1 3 4
输出
2 1 3 4 5
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
#include <iostream>
using namespace std;
const int N=1e5+10;
int n,a[N]={0};
int find_set(int x)
{
return a[x]==0?x:a[x]=find_set(a[x]);
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int d;
scanf("%d",&d);
d=find_set(d);
a[d]=d+1;
cout<<d<<" ";
}
return 0;
}