Codeforces Round #436 (Div. 2), problem: (D) Make a Permutation!

Posted LMissher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #436 (Div. 2), problem: (D) Make a Permutation!相关的知识,希望对你有一定的参考价值。

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
int main(){
	int a[210000],flag[210000],lag[210000],n;
	vector<int> vec;
	memset(flag,0,sizeof(flag));
	memset(lag,0,sizeof(lag));
	vec.clear();
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
		flag[a[i]]++;
	}
	for(int i=1;i<=n;i++){
		if(!flag[i])	vec.push_back(i);
	}
	if(vec.empty()){
		printf("0\n");
		for(int i=0;i<n;i++)	i==0?printf("%d",a[i]):printf(" %d",a[i]);
		printf("\n");
	}
	else{
		int tot=0;
		for(int i=0;i<n;i++){
			//printf("%d\n",flag[a[i]]);
			if(flag[a[i]]>1&&a[i]>vec[tot]){
				flag[a[i]]--;
				a[i]=vec[tot];
				tot++;
			}
			else if(flag[a[i]]>1&&a[i]<vec[tot]){
				if(!lag[a[i]]){
					lag[a[i]]=1;
					continue;
				}
				else if(lag[a[i]]){
					flag[a[i]]--;
					a[i]=vec[tot];
					tot++;
				}
			}
			//printf("%d\n",flag[a[i]]);
		}
		printf("%d\n",vec.size());
		for(int i=0;i<n;i++)	i==0?printf("%d",a[i]):printf(" %d",a[i]);
		printf("\n");
	}
	return 0;
}

以上是关于Codeforces Round #436 (Div. 2), problem: (D) Make a Permutation!的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #436 E

Codeforces Round #436 (Div. 2)

[Codeforces] Round #436 (Div. 2)

Codeforces Round #436 (Div. 2)ABCDE

Codeforces Round #436 C. Bus

Codeforces Round #436 A. Fair Game