传送门1
传送门2
思路:
忍不住吐糟……
刚开始我想错了
知道每个组是相互独立的
然后就很天真的以为确定出每个组的胜负关系,异或一下就可以了
手玩一下,发现胜负规律很简单
然后得了20分……
然后改成了把答案”或”起来
然后就得了80分?!
woc
其实每个组就是相互独立的
只不过你要求出各自的SG函数
然后异或起来,判断是否为0
实际上手玩单个组的胜负关系+记忆化搜索SG函数是可以拿到40分的
但是通过打(ti)表(jie)我们发现
SG(i,j)实际上等于k,k是满足下条件的最小自然数
i−1<2k
(mod
2k+1)
且
j−1<2k
(mod
2k+1)
然后就可以做了
复杂度
O(TnP)
P=30左右
#include<cstdio>
using namespace std;
int n,a[20001];
int sg(int x,int y)
{
long long t=2;
for(int i=0;;++i,t<<=1)
if ((x-1&t-1)<(t>>1)&&(y-1&t-1)<(t>>1))
return i;
}
int in()
{
int t=0;char ch=getchar();
while (ch>'9'||ch<'0') ch=getchar();
while (ch>='0'&&ch<='9') t=(t<<1)+(t<<3)+ch-48,ch=getchar();
return t;
}
main()
{
for (int ans=0,T=in();T;--T)
{
n=in();ans=0;
for (int i=1;i<=n;++i)
{
a[i]=in();
if (!(i&1)) ans^=sg(a[i-1],a[i]);
}
if (ans) puts("YES");
else puts("NO");
}
}