要过年了,大家开始对对联,即一个人写出上联,另一个人来对下联。现在给定一个长度为 n 的上联,为了方便读入,上联中的每个字都用一个正整数代替。
你需要为这个上联写一个下联,要求如下:
第一行输入一个正整数 n,表示数字的个数。接下来一行包含 n 个整数,分别表示每一个正整数。
输出 n 个整数,表示下联。
6 3 3 4 2 4 7
1 1 5 6 5 8
令 3 对应 1,4 对应 5,2 对应 6,7 对应 8,则下联为 [1,1,5,6,5,8]。此为字典序最小的对联,若令 3 对应 9,则下联为 [9,9,5,6,5,8],也是一种合法的下联,但是不是题目所求的字典序最小的下联。
3 1 2 3
4 5 6
8 11 1 2 11 1 5 6 7 8
3 4 8 3 4 9 10 12
对于 20 的数据,有 1 ≤ n,ai ≤ 1000
对于 40 的数据,有 1 ≤ n ≤ 100000,1 ≤ ai ≤ 1000
对于 60 的数据,有 1 ≤ n,ai ≤ 100000
对于另外 20 的数据,有 1 ≤ n ≤ 1000,1 ≤ ai ≤ 109
对于 100 的数据,有 1 ≤ n ≤ 100000,1 ≤ ?? ≤ 109
#include <bits/stdc++.h>
using namespace std;
const int N=1e8;
bool u[N];
int us[N];
int l[100001];
int n,nu;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){scanf("%d",&l[i]);u[l[i]]=1;}
for(int i=1;i<=n;i++)
{
if(us[l[i]]) continue;
while(u[++nu]);
us[l[i]]=nu;
}
for(int i=1;i<=n;i++) printf("%d ",us[l[i]]);
}