打卡信奥刷题(3401)用C++实现信奥题 P10032 「Cfz Round 3」Mex of Sequence

P10032 「Cfz Round 3」Mex of Sequence

题目描述

请注意本题特殊的时间限制。

给定一个长度为 nnn 的序列 aaa 和一个整数 mmm

我们定义一次操作为,同时将序列 aaa 中的每个元素 aia_iai 替换为序列 aaa 中除 aia_iai 以外的所有元素的 mex⁡\operatorname{mex}mex

你需要求出进行 mmm 次操作后的序列 aaa

其中,一个序列的 mex⁡\operatorname{mex}mex 为该序列中未出现过的最小自然数,例如:

  • mex⁡{1,2,3}=0\operatorname{mex}\{1,2,3\}=0mex{1,2,3}=0
  • mex⁡{0}=1\operatorname{mex}\{0\}=1mex{0}=1
  • mex⁡{1,0,2,4}=3\operatorname{mex}\{1,0,2,4\}=3mex{1,0,2,4}=3
  • mex⁡{2,1,3,0,2}=4\operatorname{mex}\{2,1,3,0,2\}=4mex{2,1,3,0,2}=4

特别地,当序列为空时,该序列的 mex⁡\operatorname{mex}mex000

输入格式

本题有多组测试数据。

第一行输入一个整数 TTT,表示测试数据组数。

接下来依次输入每组测试数据。对于每组测试数据:

  • 第一行输入两个整数 n,mn,mn,m
  • 第二行输入 nnn 个整数,表示给定的序列 aaa

输出格式

对于每组测试数据,输出一行,包含用空格分隔的 nnn 个整数,表示进行 mmm 次操作后的序列 aaa

输入输出样例 #1

输入 #1

3
4 1
1 0 1 2
4 5
9 9 6 1
3 5
1 3 0

输出 #1

3 0 3 2
0 0 0 0
1 2 0

说明/提示

「样例解释 #1」

对于第 111 组数据,因为 mex⁡{0,1,2}=3\operatorname{mex}\{0,1,2\}=3mex{0,1,2}=3mex⁡{1,1,2}=0\operatorname{mex}\{1,1,2\}=0mex{1,1,2}=0mex⁡{1,0,2}=3\operatorname{mex}\{1,0,2\}=3mex{1,0,2}=3mex⁡{1,0,1}=2\operatorname{mex}\{1,0,1\}=2mex{1,0,1}=2,所以进行 111 次操作后的序列 aaa{3,0,3,2}\{3,0,3,2\}{3,0,3,2}

「数据范围」

∑n\sum nn 表示单个测试点中 nnn 的和。

对于所有数据,1≤T≤10001 \le T \le 10001T10001≤n≤1061 \le n \le 10^61n1061≤m≤1091 \le m \le 10^91m1090≤ai≤1090 \le a_i \le 10^90ai109∑n≤106\sum n \le 10^6n106

只有你通过本题的所有测试点,你才能获得本题的分数。

C++实现

#include <bits/stdc++.h>

using namespace std;
const int N=1e6+5;
int n,m,a[N],cnt[N];
void work(){
	int res=0;
	for(int i=0;i<=n;i++) 
		cnt[i]=0;
	for(int i=1;i<=n;i++) 
		if(a[i]<=n) 
			cnt[a[i]]++;
	for(int i=n;i>=0;i--) 
		if(cnt[i]==0) 
			res=i;
	for(int i=1;i<=n;i++) 
		if(a[i]>res||cnt[a[i]]>1) 
			a[i]=res;
}
void solve(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	work();
	if(m!=1){
		work();
		if(m%2==1) work();
	}
	for(int i=1;i<=n;i++) cout<<a[i]<<(i==n?'\n':' ');
}
signed main(){
	ios::sync_with_stdio(0);
	int T=1;
	cin>>T;
	while(T--) solve();
	return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值