【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;
}
posted @ 2023-09-09 17:38  Alric  阅读(13)  评论(0编辑  收藏  举报