题意
定义 数组MEX 为数组中 没出现过的 最小非负整数
给 一个长度n的 数组ai
ai是每个前i个bi为数组 的MEX
现求b数组
思路
如果要 a[i] 和a[i-1]不同
那么必然 b[i]=a[i-1]
那么接下来考虑剩余的b[i]
只要满足 其不能是a数组有的 就可以了
剩下的可以用升序来排列
小细节是 a[n]也不能出现在b数组
AC代码
#include <bits/stdc++.h>
#define endl "\n"
#define INF 0x3f3f3f3f3f3f3f3f
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
const double PI = acos(-1.0);
const double EI = exp(1.0);
const int N = 1e6+10;
const int maxn = 205;
const double eps = 1e-8;
int a[N];
int b[N];
int m[N];
void solve()
{
int n;
int flag = 1;
cin >> n;
int cnt = 0;
memset(b, -1, sizeof(b));
memset(m, 0, sizeof(m));
for (int i = 1; i <= n; i++)
{
cin >> a[i];
if (a[i] != a[i - 1])
{
b[i] = a[i - 1];
m[b[i]] = 1;
}
}
m[a[n]] = 1;
for (int i = 1; i<=n; i++)
{
while (m[cnt])
cnt++;
if (b[i] == -1)
{
b[i] = cnt;
m[cnt] = 1;
cnt++;
}
}
for (int i = 1; i <= n; i++)
cout << b[i] << " ";
cout << endl;
}
int main()
{
std::ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
//int t; cin >> t; while (t--)
solve();
return 0;
}