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

北慕城南 提交于 2020-08-10 05:39:08

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

Problem Lang Verdict Time Memory
C - Ehab and Prefix MEXs GNU C++17 Accepted 62 ms 1600 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 绕不开的叶节点+特判

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!