D. Replace by MEX
题意:
存在一个数组A,令该数组中不存在的最小非负数为MEX,每次操作可以让任意a[i]=mex
,请在2N的操作次数以内使得数组A非递减
思路:
让a[i]=i,每次操作完边界a[i]都让边界缩小,如果mex==n就放在a[n-1]
代码附:
#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5+10;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t,n;
cin>>t;
while(t--)
{
cin>>n;
vector<int>a(n);
vector<int>ans;
for(int i=0; i<n; ++i)
cin>>a[i];
for(int L=0; L<n;)
{
vector<bool>vis(n+1,false);
for(int i=L; i<n; ++i)
vis[a[i]]=1;
int mex=L;
for(; mex<n&&vis[mex]; ++mex);
if(mex==L)
{
L++;
ans.push_back(L);
continue;
}
a[max(mex-1,L)]=mex;
ans.push_back(mex);
}
cout<<ans.size()<<endl;
for(int i=0; i<ans.size(); ++i)
cout<<ans[i]<<" ";
cout<<endl;
}
return 0;
}