水题 写的有点丑
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <ctype.h>
#include <vector>
#include <algorithm>
#include <sstream>
#define PI acos(-1.0)
#define in freopen("in.txt", "r", stdin)
#define out freopen("out.txt", "w", stdout)
using namespace std;
typedef long long ll;
const int maxn = 200000 + 7, INF = 0x3f3f3f3f, mod = 1e9 + 7;
int n, nn;
int vis[maxn], cnt[maxn], ans[maxn];
priority_queue<int, vector<int>, greater<int> > qu;
void init() {
scanf("%d", &n);
nn = 0;
for(int i = 0; i < n; ++i) {
scanf("%d", &ans[i]);
cnt[ans[i]]++;
}
for(int i = 1; i <= n; ++i) {
if(cnt[i] == 0) qu.push(i), nn++;
}
printf("%d\n", nn);
}
void solve() {
if(cnt[ans[0]] > 1) { // first
if(qu.top() < ans[0]) {
cnt[ans[0]] --;
printf("%d", qu.top());
qu.pop();
} else {
vis[ans[0]]++;
printf("%d", ans[0]);
}
}
else {
printf("%d", ans[0]);
vis[ans[0]]++;
}
for(int i = 1; i < n; ++i) {
if(vis[ans[i]]) {
printf(" %d", qu.top());
qu.pop();
} else {
if(cnt[ans[i]] > 1) {
if(qu.top() < ans[i]) {
cnt[ans[i]] --;
printf(" %d", qu.top());
qu.pop();
} else {
vis[ans[i]]++;
printf(" %d", ans[i]);
}
} else {
printf(" %d", ans[i]);
vis[ans[i]]++;
}
}
}
}
int main() {
init();
solve();
return 0;
}
/*
4
3 2 2 3
6
4 5 6 3 2 1
*/