P10370 「LAOI-4」Mex Tower (Hard ver.) 题解

有一定难度的思维题。

题目传送门

思路

首先,\(\operatorname{mex}(x,y)\) 的结果一定为 \(0,1,2\),因为只有两个数,所以结果最多为 \(2\)\(x=1,y=0\)\(x=0,y=1\) 时)。因此,可以将问题转化为最后的数是否为 \(2\)

考虑倒推,当 \(n=1\) 时,显然只能为 \(2\);要从 \(n=2\) 的情况变为 \(n=1\) 的情况,那么这两个数应该为 \(0\)\(1\);当 \(n=3\) 时,\(a_1\ge 1,a_2\ge 2,a_3=0\)(当然反过来也可以)。

多推几个 \(n\),发现最后的结果是否为 \(2\) 只与中间的三个数有关,并且有如下规律:

  • \(mid=\left\lfloor\dfrac{n+1}{2}\right\rfloor\)
  • \(n\bmod 2=1\),则当 \(a_{mid-1}\ge1,a_{mid}\ge 2,a_{mid+1}=0\)\(a_{mid+1}\ge1,a_{mid}\ge 2,a_{mid-1}=0\) 时,最后的数字为 \(2\)
  • \(n\bmod 2=0\),则当 \(a_{mid}=0,a_{mid+1}=1,a_{mid+2}\ge 1\)\(a_{mid+1}=0,a_{mid}=1,a_{mid-1}\ge 1\) 时,最后的数字为 \(2\)

注意特判 \(n=2\) 的情况。

核心代码

mid=(n+1)/2;
if(n==2) {
	if((a[1]==1&&a[2]==0)||(a[1]==0&&a[2]==1))cout<<"Yes";
	else cout<<"No";
} else {
	if(n%2) {
		if((a[mid-1]>=1&&a[mid]>=2&&a[mid+1]==0)||(a[mid+1]>=1&&a[mid]>=2&&a[mid-1]==0))cout<<"Yes";
		else cout<<"No";
	} else {
		if((a[mid]==0&&a[mid+1]==1&&a[mid+2]>=1)||(a[mid+1]==0&&a[mid]==1&&a[mid-1]>=1))cout<<"Yes";
		else cout<<"No";
	}
}
posted @ 2024-12-13 21:53  ni_ju_ge  阅读(22)  评论(0)    收藏  举报