您的位置:首页 > 其它

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

2017-09-25 22:58 459 查看
优先队列随便搞搞就过了。

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

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: