T3错误思路,求证伪(也可能是代码的锅)
  • 板块学术版
  • 楼主Resstifnurvˆwˆ.tar.gz
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/4/20 17:10
  • 上次更新2024/4/20 17:43:31
查看原帖
T3错误思路,求证伪(也可能是代码的锅)
881015
Resstifnurvˆwˆ.tar.gz楼主2024/4/20 17:10

可以看出当 f(a)=2f(a)=2 时输出 Yes,否则输出 No。
然后我推算了一下,最后搞出了一个思路:

  • 当 nn 是奇数时,令 mid=n+12mid= \frac{n+1}{2},则当 a[mid]=2a[mid]=2,且 a[mid−1]a[mid-1] 与 a[mid+1]a[mid+1] 中恰好一个为 00 一个不为 00 的时候,满足 f(a)=2f(a)=2;
  • 当 nn 是偶数时,令mid=n2mid= \frac{n}{2},则当 a[mid]a[mid] 与 a[mid+1]a[mid+1] 中恰好有一个为 11 另一个为 00 ,且为 11 的那一侧相邻的那个数(即 a[mid−1]a[mid-1] 或 a[mid+2]a[mid+2])不为 00 时,满足 f(a)=2f(a)=2;

于是我就按照上面口胡的做法写了一个代码,然后成功 WA。
所以希望大家看一看我的思路有什么问题(或者直接分享一下正解),或者代码哪里写挂了(雾)

代码:

#include<iostream>
#include<algorithm>
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,n;
const int N=3e6+10;
int a[N];
//int b[3]={0,2,1},c[3]={1,2,0};

int main(){
	T=read();
	while(T--){
		n=read();
		for(int i=1;i<=n;i++) a[i]=min(read(),2);
		if(n&1){
			int mid=(n+1)>>1;
			if(a[mid]==2&&((a[mid-1]==0)^(a[mid+1]==0))) puts("Yes");
			else puts("No");
		}
		else{
			int mid=n>>1;
			if((a[mid]^a[mid]+1)==1){
				if(n==2) puts("Yes");
				else if(a[mid]) puts((!a[mid-1])?"Yes":"No");
				else if(a[mid+1]) puts((!a[mid+2])?"Yes":"No");
			}
			else puts("No");
		}
	}
	return 0;
}
2024/4/20 17:10
加载中...