?
# | 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 |
#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"; } } }
?
?
?
?