【CF-1348 B】Phoenix and Beauty 思维
B. Phoenix and Beauty
题意
给出一个长度为n的整数数组\(a\),\(a[i]\leq n\),以及数字k,现在你可以向数组任意一个位置,
插入数字1-n,使得数组中长度为k的连续子数组和都相等,如果可以输出最后的数组,否
则输出-1。
思路
只需要把整个数组变成一个循环节长度为k的周期数组。
假设此时有\(num\)个不同的数字,如果\(num>k\),肯定不可以,
如果\(num<=k\),在最后随便加上1-n的几个数字凑够k个,输出N次所有不同的数字即可。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int inf=0x3f3f3f3f;
typedef long long ll;
int arr[N],brr[N],vis[N];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(vis,0,sizeof(vis));
int n,k,num=0;
scanf("%d%d",&n,&k);
for(int i=1; i<=n; i++)
{
scanf("%d",&arr[i]);
if(!vis[arr[i]])
num++;
vis[arr[i]]=1;
}
if(num>k)
{
printf("-1\n");
continue;
}
int tot=0;
for(int i=1; i<=100; i++)
{
if(vis[i])
brr[++tot]=i;
}
for(int i=tot+1;i<=k;i++) brr[i]=brr[i-1];
printf("%d\n",n*k);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=k;j++) printf("%d ",brr[j]);
}
printf("\n");
}
return 0;
}