1. 程式人生 > >Codeforces Round #436 (Div. 2), problem: (D) Make a Permutation!

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

scanf problem codeforce ++ round class span com make

#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!