【Codeforces1364C】Ehab and Prefix MEXs(构造)
题目大意:
给出长度为\(n(1\le n\le 10^5)\)的数组\(a\),构造数组\(b\)使得\(a_i=MEX\{b_1,b_2,...,b_i\}\)
首先考虑当\(b_1,b_2,...,b_n\)为什么数时,\(a_n=MEX\{b_1,b_2,...,b_n\}\)。
然后再考虑当\(b_1,b_2,...,b_{n-1}\)为什么数时,\(a_{n-1}=MEX\{b_1,b_2,...,b_{n-1}\}\)。
根据\(a_n\)和\(a_{n-1}\)的区别从而决定\(b_n\)的值,依此类推,直到得到\(b_1\)的值为止。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,a[100000+10],b[100000+10],cnt[100000+10];
int main(){
cin >> n;
for(ll i=1;i<=n;i++)cin >> a[i];
for(ll i=0;i<a[n];i++)cnt[i]=1;
for(ll i=a[n];i<n;i++)cnt[a[n]+1]++;
ll j=a[n]+1;
for(ll i=n-1;i>=0;i--){
if(cnt[a[i]]){
b[i+1]=a[i];
cnt[a[i]]--;
}else{
while(cnt[j]==0)j--;
b[i+1]=j;
cnt[j]--;
}
}
for(ll i=1;i<=n;i++){
cout << b[i] << ' ';
}
return 0;
}