【补题】Codeforces Round 649 (Div. 2) C. Ehab and Prefix MEXs

题意:

思路:  构造题

1.因为题目的严格限制

因此是不会出现-1的,因为mex函数本身要求最小就是非递减的,但是题目直接满足了,然后mex函数不能返回出现数字数量+1的数字,但是题目满足了<=i所以也符合,因此是没有-1的。也就是一定有答案
2.因为MEX函数必须要求数字的连贯,所以只要不出现数字本身,就不会产生更大的数字,因此只要不输出数字本身,在满足其他数字都连贯的情况下,就能控制输出的值

所以根据这个思路,只需要让未出现数字保持连贯,也就是需要出现,我们控制要求数字的输出,就能成功构造,其实也类似于更改顺序
0 0 0 0 5    5 5 5 5 10
1 2 3 4 0    6 7 8 9 5
不知道这样有没有理解,只要不输出之前出现的数字,就能掌控,然后我们在连续相同值去帮助MEX函数填充,允许MEX函数产生更大值即可。
 

那么代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
const int N = 2e6+10;
const int INF = 1e15;
const int MOD = 1e9+7;

int vis[N];

void solve(){
	int n;
	cin >> n;
	int big=0;
	vector<int> ve(n);
	for(int i=0;i<n;i++){
		cin >> ve[i];
		big=max(big,ve[i]);
		vis[ve[i]]=1;
	}
	
	int now=1;
	vector<int> ans(n);
	for(int i=0;i<n;i++){
		if(i==0 && ve[i]==1){
			ans[i]=0;
		}
		else if(i==0){
			while(vis[now]==1)
				now++;
			ans[i]=now;
			now++;
		}
		else{
			if(ve[i]!=ve[i-1])
				ans[i]=ve[i-1];
			else{
				while(vis[now]==1)
					now++;
				ans[i]=now;
				now++;
			}
		}
	}
	
	for(auto i : ans)
		cout << i << " ";
	
	
}

signed main(){
	IOS;
	
	int t=1;
//	cin >> t;
	while(t--){
		solve();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值