题意:
思路: 构造题
1.因为题目的严格限制
因此是不会出现-1的,因为mex函数本身要求最小就是非递减的,但是题目直接满足了,然后mex函数不能返回出现数字数量+1的数字,但是题目满足了<=i所以也符合,因此是没有-1的。也就是一定有答案
2.因为MEX函数必须要求数字的连贯,所以只要不出现数字本身,就不会产生更大的数字,因此只要不输出数字本身,在满足其他数字都连贯的情况下,就能控制输出的值
所以根据这个思路,只需要让未出现数字保持连贯,也就是需要出现,我们控制要求数字的输出,就能成功构造,其实也类似于更改顺序
0 0 0 0 5 5 5 5 5 10
1 2 3 4 0 6 7 8 9 5
不知道这样有没有理解,只要不输出之前出现的数字,就能掌控,然后我们在连续相同值去帮助MEX函数填充,允许MEX函数产生更大值即可。
那么代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
const int N = 2e6+10;
const int INF = 1e15;
const int MOD = 1e9+7;
int vis[N];
void solve(){
int n;
cin >> n;
int big=0;
vector<int> ve(n);
for(int i=0;i<n;i++){
cin >> ve[i];
big=max(big,ve[i]);
vis[ve[i]]=1;
}
int now=1;
vector<int> ans(n);
for(int i=0;i<n;i++){
if(i==0 && ve[i]==1){
ans[i]=0;
}
else if(i==0){
while(vis[now]==1)
now++;
ans[i]=now;
now++;
}
else{
if(ve[i]!=ve[i-1])
ans[i]=ve[i-1];
else{
while(vis[now]==1)
now++;
ans[i]=now;
now++;
}
}
}
for(auto i : ans)
cout << i << " ";
}
signed main(){
IOS;
int t=1;
// cin >> t;
while(t--){
solve();
}
}