昨晚Div3的E
查看原帖
昨晚Div3的E
271736
Daidly楼主2022/8/2 10:23

昨晚不知道为什么错,WA2 就跑路睡觉了,今天早上起来拍了半个小时还没拍出错,确实难拍,求大佬看下。

思路是:发现所有除 0,50,5 外的数都可以操作到 2,4,8,62,4,8,6 这个循环里,计算 ii22 需要加上的数值:add[10]={1,1,0,9,18,1,6,25,14,23};add[10]=\{-1,1,0,9,18,-1,6,25,14,23\};

比如 add[7]=25add[7]=25 就是 748627\to4\to8\to6\to2

相当于 7141826327\to14\to18\to26\to32,需要加 327=2532-7=25

add[0]=1,add[5]=1add[0]=-1,add[5]=-1 即不可能达到。

将所有数的个位变成 22 之后,看十位奇偶性是否相同即可,因为 2,4,8,62,4,8,6 一圈增量是 2020

然后判断 能否全变成个位为 00 且全部相同的数就行。

如下图:

#include<bits/stdc++.h>
using namespace std;

inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}

const int MAXN=2e5+5;
int t,n,a[MAXN],b[MAXN],add[10]={-1,1,0,9,18,-1,6,25,14,23};

int main(){
	t=read();
	while(t--){
		n=read();
		int cnt=0;
		for(int i=1;i<=n;++i){
			a[i]=read();
			if(a[i]==a[i-1])cnt++;
		}
		if(cnt==n-1){puts("YES");continue;}
		cnt=0;
		for(int i=1;i<=n;++i){
			b[i]=a[i];
			if(add[b[i]%10]==-1){cnt=-1;break;}
			b[i]+=add[b[i]%10];
			if((b[i]/10)&1)cnt++;
		}
		if(cnt==0||cnt==n){puts("YES");continue;}
		cnt=0;
		for(int i=1;i<=n;++i){
			b[i]=a[i];
			if(b[i]%5!=0){cnt=-1;break;}
			if(b[i]%10!=0)b[i]+=5;
			if(b[i]==b[i-1])cnt++;
		}
		if(cnt==n-1){puts("YES");continue;}
		puts("NO");
	}
	return 0;
}
2022/8/2 10:23
加载中...