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";
}
}

浙公网安备 33010602011771号