题意。。。不多哔哔了,描述不清
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; }