优先队列随便搞搞就过了。
出现一次的直接输出。没出现的数字放在优先队列里,当判断到出现多次的数字时,和优先队列的队首比较一下,选择较小的输出。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200100;
int mark[MAXN];
int num[MAXN];
int main()
{
int n;
scanf("%d",&n);
for(int i = 1; i <= n; ++i)
{
scanf("%d",&num[i]);
mark[num[i]]++;
}
priority_queue<int,vector<int>,greater<int>> que;
for(int i = 1; i <= n; ++i)
{
if(!mark[i])
que.push(i);
}
printf("%d\n",que.size());
for(int i = 1; i <= n; ++i)
{
if(mark[num[i]] == 1)
{
printf("%d ",num[i]);
}
else if(mark[num[i]] > 1)
{
if(num[i] < que.top())
{
printf("%d ",num[i]);
mark[num[i]] = 0;
}
else
{
mark[num[i]]--;
printf("%d ",que.top());
que.pop();
}
}
else
{
printf("%d ",que.top());
que.pop();
}
}
return 0;
}