思路在代码注释里
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
inline int read(){
int ret=0;
char ch=' ',c=getchar();
while(!('0'<=c&&c<='9')) ch=c,c=getchar();
while('0'<=c&&c<='9') ret=(ret<<1)+(ret<<3)+(c^48),c=getchar();
return ch=='-'?-ret:ret;
}
int T;
int n,m;
const int N=1e6+10;
int a[N];
map<int,int> cnt,tmp;
map<int,int>::iterator it,it2;
int main(){
T=read();
while(T--){
n=read(),m=read();
cnt=tmp;
for(int i=1;i<=n;i++){
a[i]=read();
cnt[a[i]]++;
}
int now=0;
bool flag=false;
for(it=cnt.begin();it!=cnt.end();it++){
if((*it).first!=now){
//now根本没出现,那么第一次变换后所有>now的都变成now,第二次变换后都变成(now+1)
if(m&1){
for(int i=1;i<=n;i++){
if(a[i]<now) printf("%d ",a[i]);
else printf("%d ",now);
}
}
else{
for(int i=1;i<=n;i++){
if(a[i]<now) printf("%d ",a[i]);
else printf("%d ",now+1);
}
}
flag=true;
break;
}
else if(cnt[now]>=2){
//now出现两次以上,那么第一次变换后>=now的所有数都>now,第二次变换后就全部=now,第三次都变成(now+1),以此类推
if(m==1){
int mn=-1;
int tar=0;
for(it2=cnt.begin();it2!=cnt.end();it2++){
if((*it2).first!=tar){
mn=tar;
break;
}
tar++;
}
if(mn==-1) mn=tar;
for(int i=1;i<=n;i++){
if(cnt[a[i]]==1) printf("%d ",min(a[i],mn));
else printf("%d ",mn);
}
}
else if(m&1){
for(int i=1;i<=n;i++){
if(a[i]<now) printf("%d ",a[i]);
else printf("%d ",now+1);
}
}
else{
for(int i=1;i<=n;i++){
if(a[i]<now) printf("%d ",a[i]);
else printf("%d ",now);
}
}
flag=true;
break;
}
else now++; //只出现一次,那么这个数不会变
}
if(!flag){
for(int i=1;i<=n;i++) printf("%d ",a[i]);
}
puts("");
}
return 0;
}
Wrong Answer.wrong answer On line 6 column 1, read 1, expected 0.