Codeforces Round #436 (Div. 2) D. Make a Permutation!(优先队列)

来源:互联网 发布:禁止域名转出万网 编辑:程序博客网 时间:2024/06/08 00:13

优先队列随便搞搞就过了。
出现一次的直接输出。没出现的数字放在优先队列里,当判断到出现多次的数字时,和优先队列的队首比较一下,选择较小的输出。

#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;}
阅读全文
0 0
原创粉丝点击