题意。。。不多哔哔了,描述不清
mex(S)的值为集合S中没有出现过的最小自然数。例如,mex({1,2}) = 0、mex({0,1,2,3}) = 4
题解:我们从哪里下手呢?
首先我们可以看到a[i]严格小于等于i
再者保证a是一个不下降序列
因为所有的数小于1e6所以我们不妨开一个数组来记录一下出现过的数字
用visited数组记录出现过的数字,若出现过标记为true,没有出现过则为false
类似于我图片上的样子
/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 1e6+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
int a[maxn];
bool visited[maxn];
int main()
{
int n;
cin>>n;
memset(visited,false,sizeof(visited));
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
visited[a[i]]=true;
}
int pos=0;
for(int i=1;i<=n;i++){
if(a[i]!=a[i-1]&&i!=1) printf("%d ",a[i-1]);
else{
while(visited[pos]==true) pos++;
printf("%d ",pos++);
}
}
return 0;
}

京公网安备 11010502036488号