一定注意数组范围,不然会被Hack。
a,s数组可以只开1010。而数组b一定是要开2010,开1010是不够的,会被Hack。我这方便起见,全部开为2010。
这就一个找规律的题。先找规律,再随机分配。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 2010;
int a[maxn];
int b[maxn];
int s[maxn];
int n;
int ans;
int main(){
int t;
cin >> t;
while(t--){
memset(s,0,sizeof(s));
cin >> n;
for(int i = 1;i <= n;i++){
cin >> a[i];
s[a[i]]++;
}
ans = 0;
while(1){
int p = -1;
for(int i = 0;i <= n;i++){
if(!s[i]){
p = i;
break;
}
}
//cout << p << endl;
if(p != 0){
b[ans++] = p;
s[a[p]]--;
a[p] = p;
s[p]++;
}
else {
int flag = 0;
for(int i = 1;i <= n;i++){
if(a[i] != i){
flag = 1;
b[ans++] = i;
s[a[i]]--;
a[i] = 0;
s[p]++;
break;
}
}
if(!flag) break;
}
/*for(int i = 0;i <= n;i++){
cout << s[i] << " ";
}
cout << endl;*/
}
cout << ans << endl;
for(int i = 0;i<ans;i++){
if(i) cout << " ";
cout << b[i];
}
cout << endl;
/*for(int i = 0;i<n;i++){
if(i) cout << " ";
cout << a[i];
}
cout << endl;*/
}
return 0;
}