分析:
整个问题可以看做是n/2个子问题组成的
根据博弈问题的基本套路,我们要找到每一种状态的SG值,异或起来
如果异或和是0,说明先手必败
所以题解都是打表找规律
那好,我把表给出来:
看的我想吐。。。
一个显然的规律:
若x和y都是奇数,那么sg=0
至于整个数据的规律,需要一点想象力
我们从左上角向右下角看,可以发现是一个逐渐递增的三角形
三角形的值也在递增
实际上SG值满足规律:
- x为奇数,y为奇数:SG=0
- x为偶数,y为偶数:SG=SG(x/2 , y/2)+1
- x为奇数,y为偶数:SG=SG((x+1)/2 , y/2)+1
- x为偶数,y为奇数:SG=SG(x/2 , (y+1)/2)+1
tip
对于这种找规律的题目,我无f*ck说
只能说多积累,多观察
#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long
using namespace std;
int n;
int sg(ll x,ll y)
{
if ((x&1)&&(y&1)) return 0;
else if (!(x&1)&&!(y&1)) return sg(x/2,y/2)+1;
else if (x&1) return sg((x+1)/2,y/2)+1;
else return sg(x/2,(y+1)/2)+1;
}
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
int ans=0;
scanf("%d",&n);
ll x,y;
for (int i=1;i<=n;i+=2)
{
scanf("%lld%lld",&x,&y);
ans^=sg(x,y);
}
if (ans==0) printf("NO\n");
else printf("YES\n");
}
return 0;
}