WA On #2求助
查看原帖
WA On #2求助
881015
Resstifnurvˆwˆ.tar.gz楼主2024/1/1 18:20

思路在代码注释里

#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.

2024/1/1 18:20
加载中...