【CF1364C】Ehab and Prefix MEXs(构造)

发布时间 2023-09-09 17:43:27作者: Alric

题目大意:

给出长度为\(n(1\le n\le 10^5)\)的数组\(a\),构造数组\(b\)使得\(a_i=MEX\{b_1,b_2,...,b_1\}\)


首先考虑当\(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;
}