[codeforces 1364C] Ehab and Prefix MEXs MEX数据生成

Codeforces Round #649 (Div. 2)  参与排名人数11286

[codeforces 1364C]   Ehab and Prefix MEXs   MEX数据生成

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址https://codeforces.com/contest/1364/problem/C

ProblemLangVerdictTimeMemory
C - Ehab and Prefix MEXs GNU C++17Accepted62 ms1600 KB

题目大意:根据MEX({b1})=a1,MEX({b1,b2})=a2,MEX({b1,b2,b3})=a3,......

推导出数组b的各个元素,若不存在数组b,则输出-1.

第一步,明确,按题意,都能找到数组b.

第二步,因数组a是非递减序列,若a[i]!=a[i-1],则b[i]=a[i-1];

若a[i]==a[i-1],那么b[i]可以在[0,n]中未占用的数据中,自小到大,进行选取。

样例模拟如下

3
1 2 3

0 1 2 

在区间[0,3]未被占用的数是0
b[1]=0
因a[2]=2,a[1]=1,a[2]!=a[1],故a[1]=1可以腾出给b[2]使用
b[2]=1
因a[3]=3,a[2]=2,a[3]!=a[2],故a[2]=2可以腾出给b[3]使用
b[3]=2

故输出
0 1 2
4
0 0 0 2

1 3 4 0  

在区间[0,4]未被占用的数是1,3,4
b[1]=1
因a[2]=0,a[1]=0,a[2]==a[1],故自小到大使用未占用数3给b[2]使用
b[2]=3
因a[3]=0,a[2]=0,a[3]==a[2],故自小到大使用未占用数4给b[3]使用
b[3]=4
因a[4]=2,a[3]=0,a[4]!=a[3],故a[3]=0可以腾出给b[4]使用
b[4]=0

故输出
1 3 4 0
3
1 1 3

0 2 1   

在区间[0,3]未被占用的数是0,2
b[1]=0
因a[2]=1,a[1]=1,a[2]==a[1],故自小到大使用未占用数2给b[2]使用
b[2]=2
因a[3]=3,a[2]=1,a[3]!=a[2],故a[2]=1可以腾出给b[3]使用
b[3]=1

故输出
0 2 1

AC代码如下

#include <stdio.h>
#define maxn 100010
int a[maxn],vis[maxn],can[maxn],tot,b[maxn];
int main(){
	int n,i;
	scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%d",&a[i]),vis[a[i]]=1;
	for(i=n;i>=0;i--)
		if(!vis[i])can[++tot]=i;
	a[0]=a[1];
	for(i=1;i<=n;i++)
		if(a[i]!=a[i-1])b[i]=a[i-1];
		else b[i]=can[tot--];//a[i]==a[i-1];
	for(i=1;i<=n;i++)printf("%d ",b[i]);
	printf("\n");
	return 0;
}

类似题目

[codeforces 1294D] MEX maximizing 模是最终归宿

[codeforces 1325C] Ehab and Path-etic MEXs 绕不开的叶节点+特判

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值