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
Note

In the first example Ivan needs to replace number three in position 1 with number one, and number two in position 3 with number four. Then he will get a permutation [1, 2, 4, 3] with only two changed numbers — this permutation is lexicographically minimal among all suitable.

In the second example Ivan does not need to change anything because his array already is a permutation.

题意:给以一个序列,问最少改变多次次可以得到一个字典序最小的全排列。

题解:看到时间和这个数量级就应该想到贪心,核心就是需要改变的数字一定是重复的数字。我们把所有重复数字标记一下,然后把需要加进去的数字尽可能的放在靠前的位置(如果要加入的数字比重复数字小的话),重复的数字也要留一个位置,这里特殊处理一下,如果要加进去的数字比重复数字小,那么这个位置的重复数字就不要变动(说的有点绕,看下代码就好了)

ac代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
int vis[];
int add[];
//int zzvis[200010];
int a[];
int mark[];
struct node
{
int key;
int pos;
}ff[];
int main()
{
int n;
cin>>n;
memset(vis,,sizeof(vis));
memset(mark,,sizeof(mark));
// memset(zzvis,0,sizeof(zzvis));
int fcnt=;
for(int i=;i<n;i++)
{
scanf("%d",&a[i]);
vis[a[i]]++;
}
int cnt=;// q
for(int i=;i<=n;i++)
{
if(vis[i]==) add[cnt++]=i; if(vis[a[i-]]>=)
{
ff[fcnt].key=a[i-];
ff[fcnt++].pos=i-;
}
}
int now=;
for(int i=;i<cnt;i++)
{
// if(i==cnt-1) cout<<now<<endl;
for(int j=now;j<fcnt;j++)
{
node temp=ff[j];
if(vis[temp.key]==) // 当这个数字只有一个的时候
{
if(mark[temp.key]==) // 如果数字已经留了一次,就直接替换
{
a[temp.pos]=add[i];
now=j+;
break;
}
else continue; // 不然这个位置就不要变动了
}
if(temp.key < add[i] && mark[temp.key]==) // 如果要加入的数字比当前遍历到的重复数字小 且这个重复数字还没定位置的时候 定下位置
{
vis[temp.key]--;
mark[temp.key]=;
// cout<<"123"<<endl;
continue;
}
else // 直接替换
{
a[temp.pos]=add[i];
vis[temp.key]--;
now=j+;
break;
}
}
}
//
cout<<cnt<<endl;
cout<<a[];
for(int i=;i<n;i++)
{
cout<<' '<<a[i];
}
cout<<endl;
return ;
}

codeforce 849D. Make a Permutation!的更多相关文章

  1. Codeforce D. Make a Permutation!

    D. Make a Permutation! time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  2. codeforce 436 D贪心思维题Make a Permutation!

    D. Make a Permutation! time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  3. Permutation Sequence

    The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  4. [LeetCode] Palindrome Permutation II 回文全排列之二

    Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empt ...

  5. [LeetCode] Palindrome Permutation 回文全排列

    Given a string, determine if a permutation of the string could form a palindrome. For example," ...

  6. [LeetCode] Permutation Sequence 序列排序

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  7. [LeetCode] Next Permutation 下一个排列

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  8. Leetcode 60. Permutation Sequence

    The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  9. UVA11525 Permutation[康托展开 树状数组求第k小值]

    UVA - 11525 Permutation 题意:输出1~n的所有排列,字典序大小第∑k1Si∗(K−i)!个 学了好多知识 1.康托展开 X=a[n]*(n-1)!+a[n-1]*(n-2)!+ ...

随机推荐

  1. c++ 函数后面加一个冒号的含义

    转载自:https://zhidao.baidu.com/question/2010930169328038188.html 冒号后面跟的是赋值,这种写法是C++的特性. A( int aa, int ...

  2. 数据库中的union与union all的区别

    Union因为要进行重复值扫描,所以效率低.如果合并没有刻意要删除重复行,那么就使用Union All  两个要联合的SQL语句 字段个数必须一样,而且字段类型要“相容”(一致): 如果我们需要将两个 ...

  3. python : 设计模式之外观模式(Facade Pattern)

    #为啥要用外观模式举例说明 这个例子很形象,直接从人家博客上贴过来的,参考链接在下面 不知道大家有没有比较过自己泡茶和去茶馆喝茶的区别,如果是自己泡茶需要自行准备茶叶.茶具和开水,如图1(A)所示,而 ...

  4. 查看Linux系统的USB设备

    查看Linux系统的USB设备 lsusb (centos没有该命令) dmesg (内核日志会输出) 执行dmesg

  5. 005 文档API

    1.索引API 下面的请求把JSON对象添加到school索引,_doc映射下. 关于POST请求,如果存在索引,则更新:如果不存在,则添加. POST school/_doc/1 { "n ...

  6. ISO/IEC 9899:2011 条款6.5.10——按位与操作符

    6.5.10 按位与操作符 语法 1.AND-expression: equality-expression AND-expression    equality-expression 约束 2.这些 ...

  7. JS实现动态添加和删除div

    实现方式一:只在最后一个数据中动态添加或者删除 | 背景需要做一个页面,页面可以输入参数,点击确认按钮可以发请求给某接口.但是接口的某个字段是数组类型,所以在页面上需要实现添加或者删除元素的功能. | ...

  8. django.db.utils.OperationalError: (1251, 'Client does not support authentication protocol requested by server; consider upgrading MySQL client')

    1.打开MySQL: cmd里 net start mysql mysql -hlocalhost -uroot -p回车 进入mysql数据库 2. 命令如下: 1.use mysql; 2.alt ...

  9. Python - Django - ORM 查询方法

    models.py: from django.db import models class Human(models.Model): id = models.AutoField(primary_key ...

  10. Python - Django - 静态文件相关

    静态文件的路径设置在 settings.py 中 如果该路径发生更改的话,html 中相关路径也要进行修改 CSS: <link href="/static/dashboard.css ...