题目
题意
对长度为 n,各个元素均不同,且值在 [0,n] 范围的数组执行以下操作 k 次:
- 枚举
- 对于每个下标 i,令 ai←MEX(a1,a2,⋯,an)(MEX即为数组中未出现的最小非负整数)
求最终得到的数组。
思路
可以发现这个长度为n数组在进行n+1次操作后不发生改变,所以n+1为周期。即k=k%(n+1)
只需把找到的MEX添加到数组最后,数组成环循环每N个即为一次每次操作的答案
所以
1.找出那个原数组MEX,由于输入的ai都是属于(1,n)所以我们定义2个数组进行存放,一个存放数据,一个把以数据为下边的赋值为1,最后遍历并找出为值为0的下标的即为MEX;
题解
#include<iostream>
using namespace std;
const int N=100010;
int s[N],a[N];
void solve()
{
int n,k,j=0;
scanf("%d %d",&n,&k);
k=k%(n+1);
for(int i=0;i<n;i++)
{ int x;scanf("%d",&x);
a[i]=x;s[x]=1;
}
for(j=0;j<=n;j++)if(s[j]==0)break;
if(!k)for(int i=0;i<n;i++)cout<<a[i]<<' ';
else if(n==1&&k%2==1)cout<<j;
else if(n==1&&k%2==0)cout<<a[0];
else{
for(int i=n-k+1;i<n;i++)cout<<a[i]<<' ';
cout<<j<<' ';
for(int i=0;i<n-k;i++)cout<<a[i]<<' ';
}
cout<<endl;
for(j=0;j<=n;j++)s[j]=0,a[j]=0;
}
int main()
{
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}