Rating changes for last rounds are temporarily rolled back. They will be returned soon. ×

 
 
 
 
General
 
 
# Author Problem Lang Verdict Time Memory Sent Judged  
122812369 Contestant:
soussamerda
1530D - 9 C++17 (GCC 7-32) Skipped 311 ms 19520 KB 2021-07-17 18:33:34 2021-07-17 21:26:12
→ Source
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 312345;
#define mp make_pair
#define f first
#define s second
#define pii pair<int,int>
#define pb push_back
#define MOD 1000000007


int32_t main(){
	ios_base::sync_with_stdio(0);cin.tie(0);
	
	int t;
	cin>>t;
	while(t--){
		set<int> used;
		int n;
		cin>>n;
		vector<int> ass(n);
		for(int i=0;i<n;i++){
			cin>>ass[i];
			ass[i]--;
			used.insert(ass[i]);
		}
		if(used.size()==n){
			cout<<n<<"\n";
			for(int i=0;i<n;i++)cout<<ass[i]+1<<" ";
			cout<<"\n";
		}
		else if(used.size()==n-1){
			cout<<n-1<<"\n";
			int notused;
			for(int i=0;i<n;i++){
				if(used.find(i)==used.end()){
					notused=i;
					break;
				}
			}
			//cout<<notused<<" "<<ass[notused]<<endl;
			set<int> used2;
			vector<int> resp(n);
			for(int i=0;i<n;i++)resp[i]=-1;
			resp[notused]=ass[notused];
			used2.insert(ass[notused]);
			for(int i=0;i<n;i++){
				if(i==notused)continue;
				if(used2.find(ass[i])==used2.end()){
					used2.insert(ass[i]);
					resp[i]=ass[i];
				}
				else{
					used2.insert(notused);
					resp[i]=notused;
				}
			}
			for(int i=0;i<n;i++)cout<<resp[i]+1<<" ";
			cout<<"\n";
		}
		else{
			cout<<used.size()<<"\n";
			used.clear();
			vector<int> clean;
			vector<int> unused;
			for(int i=0;i<n;i++){
				if(used.find(ass[i])==used.end()){
					used.insert(ass[i]);
				}
				else clean.pb(i);
			}
			for(int i=0;i<n;i++){
				if(used.find(i)==used.end())
					unused.pb(i);
			}
			sort(clean.begin(),clean.end());
			if(unused==clean){
				for(int i=0;i<unused.size();i++){
					ass[clean[i]]=unused[(i+1)%unused.size()];
				}
			}
			else{
				set<int> setun;
				for(auto x:unused)setun.insert(x);
				for(int i=0;i<clean.size();i++){
					if(setun.find(clean[i])!=setun.end()){
						if(*setun.begin()!=clean[i]){
							ass[clean[i]]=*setun.begin();
							setun.erase(setun.begin());
						}
						else{
							ass[clean[i]]=*setun.rbegin();
							setun.erase(setun.find(*setun.rbegin()));
						}
						clean[i]=-1;
					}
				}
				for(int i=0;i<clean.size();i++){
					if(clean[i]!=-1){
						ass[clean[i]]=*setun.begin();
						setun.erase(setun.begin());
					}
				}
			}

			for(int i=0;i<n;i++)cout<<ass[i]+1<<" ";
			cout<<"\n";
		}
	}
	

	
}
?
Time: ? ms, memory: ? KB
Verdict: ?
Input
?
Participant's output
?
Jury's answer
?
Checker comment
?
Diagnostics
?
Click to see test details