您的位置:首页 > 其它

CodeForces - 864D Make a Permutation! 水题(用了优先队列)

2017-09-29 16:49 411 查看
水题 写的有点丑

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