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 绕不开的叶节点+特判
来源:oschina
链接:https://my.oschina.net/u/4406280/blog/4311901