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}mex 为 000。
输入格式
本题有多组测试数据。
第一行输入一个整数 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}=3,mex{1,1,2}=0\operatorname{mex}\{1,1,2\}=0mex{1,1,2}=0,mex{1,0,2}=3\operatorname{mex}\{1,0,2\}=3mex{1,0,2}=3,mex{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 n∑n 表示单个测试点中 nnn 的和。
对于所有数据,1≤T≤10001 \le T \le 10001≤T≤1000,1≤n≤1061 \le n \le 10^61≤n≤106,1≤m≤1091 \le m \le 10^91≤m≤109,0≤ai≤1090 \le a_i \le 10^90≤ai≤109,∑n≤106\sum n \le 10^6∑n≤106。
只有你通过本题的所有测试点,你才能获得本题的分数。
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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
1088

被折叠的 条评论
为什么被折叠?



