D. Make a Permutation!
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Ivan has an array consisting of n elements. Each of the elements is an integer from 1 to n.

Recently Ivan learned about permutations and their lexicographical order. Now he wants to change (replace) minimum number of elements in his array in such a way that his array becomes a permutation (i.e. each of the integers from 1 to n was encountered in his array exactly once). If there are multiple ways to do it he wants to find the lexicographically minimal permutation among them.

Thus minimizing the number of changes has the first priority, lexicographical minimizing has the second priority.

In order to determine which of the two permutations is lexicographically smaller, we compare their first elements. If they are equal — compare the second, and so on. If we have two permutations x and y, then x is lexicographically smaller if xi < yi, where i is the first index in which the permutations x and y differ.

Determine the array Ivan will obtain after performing all the changes.

Input

The first line contains an single integer n (2 ≤ n ≤ 200 000) — the number of elements in Ivan's array.

The second line contains a sequence of integers a1, a2, ..., an (1 ≤ ai ≤ n) — the description of Ivan's array.

Output

In the first line print q — the minimum number of elements that need to be changed in Ivan's array in order to make his array a permutation. In the second line, print the lexicographically minimal permutation which can be obtained from array with q changes.

Examples
Input
4
3 2 2 3
Output
2
1 2 4 3
Input
6
4 5 6 3 2 1
Output
0
4 5 6 3 2 1
Input
10
6 8 4 6 7 1 6 3 4 5
Output
3
2 8 4 6 7 1 9 3 10 5 http://www.cnblogs.com/GraceSkyer/p/7591345.html
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+;
int vis[N];
bool used[N];
int p[N],num[N];
struct node
{
int pos,val;
bool operator < (const node &A)const
{
return pos<A.pos;
}
} q[N];
int ptos[N];
int main()
{
int n,tot1=,tot2=,x;
scanf("%d",&n);
for(int i=; i<=n; ++i)
{
scanf("%d",&x);
num[i]=x;
if(!vis[x]) vis[x]=;
else if(vis[x]==)
{
vis[x]=;
q[tot1].val=x;
q[tot1++].pos=ptos[x];
q[tot1].val=x;
q[tot1++].pos=i;
}
else
{
++vis[x];
q[tot1].val=x;
q[tot1++].pos=i;
}
ptos[x]=i;
}
for(int i=; i<=n; ++i) if(!vis[i]) p[tot2++]=i;
sort(q,q+tot1);
int ct=;
for(int i=;i<tot1&&ct<tot2;++i) {
if(!used[q[i].val]&&q[i].val<p[ct]) used[q[i].val]=;
else if(vis[q[i].val]!=) {--vis[q[i].val]; num[q[i].pos]=p[ct++];}
}
printf("%d\n",tot2);
for(int i=; i<=n; ++i) printf("%d ",num[i]);
puts("");
}

最新文章

  1. iOS -Swift 3.0 -for(循环语句用法)
  2. 帝国cms内容批量替换
  3. SQL_递归查询(复杂查询示例)
  4. mac 下卸载mysql的方法
  5. iOS开发~UI布局(三)深入理解autolayout
  6. Android中 ListView 详解(二)
  7. ACM——简单排序
  8. 免费的手机号码归属地查询API接口文档
  9. 使用apktool解包和打包apk
  10. PHP 学习笔记(2)
  11. hdu_5810:Balls and Boxes(期望)
  12. GetStdHandle 函数--获取标准设备的句柄
  13. 全平台轻量级 Verilog 编译器 & 仿真环境
  14. HandlerThread学习
  15. java中级或者高级面试题分享
  16. vim-go 安装
  17. 20175312 2018-2019-2 《Java程序设计》第4周学习总结
  18. 牛客网NOIP赛前集训营-普及组(第一场)C 括号
  19. Gradle &#39;MYasprj&#39; project refresh failed Error:CreateProcess error=216, 该版本的 %1 与您运行的 Windows 版本不兼容
  20. 【CentOS】centos如何修改你的主机名

热门文章

  1. 理解分布式一致性:Paxos协议之Basic Paxos
  2. mybatis 批量保存,并且唯一约束
  3. Linux 设置秘钥登录(SSH免密连接)
  4. Red 编程语言 2019 开发计划:全速前进!
  5. .NET平台上的编译器不完全列表(转别)
  6. Codeforces Round #618 (Div. 2)-B. Assigning to Classes
  7. MySQL如何安装-教程
  8. 编程坑太多,Map 集合怎么也有这么多坑?一不小心又踩了好几个!
  9. vue-infinite-scroll------vue的无线滚动插件
  10. C. Journey bfs 拓扑排序+dp