题解:由题可知MEX表示一组数中未出现的最小非负整数,要求最大数组b,即在a中每次找到最大的MEX即可,要想MEX达到最大,就要从0开始计数,找到一个数组中不存在的数为止。从左至右遍历,删除每个数的同时记录每个数,直到找到找到一个数组中不存在的数再重新记录。
代码如下:
#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define int long long
#define endl '\n'
#define N 200005
using namespace std;
const int inf=0x3f3f3f3f;
const double ex=1e-7;
const int mod=1e9+7;
int gcd(int a ,int b){ return b ? gcd(b,a%b) : a ;}
int a[N];
void solve()
{
int n;
cin >>n;
int f[N]={0};
vector<int>v;
set<int>s;
for(int i=1;i<=n;i++)
{
cin >>a[i];
f[a[i]]++;
}
int x=0;
for(int i=1;i<=n;i++)
{
s.insert(a[i]);
f[a[i]]--;
while(s.count(x)) x++;
if(!f[x])
{
v.push_back(x);x=0;s.clear();
}
}
cout <<v.size()<<endl;
for(auto it : v)
{
cout <<it<<" ";
}
cout <<endl;
}
signed main()
{ios
int t;
cin >>t;
while(t--)
{
solve();
}
return 0;
}