题解:SG函数打个表,将每行的状态的SG值异或一下 如果最后的值为0 那么就是必败态 反之就是必胜态 对于状态更替 利用状态压缩即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <string>
#include <map>
#include <math.h>
#include <queue>
#include <climits>
#include <stack>
using namespace std;
int vis[20];
int sg[1<<20];
int dfs(int x)
{
memset(vis, 0, sizeof(vis));
for(int i = 19; i >= 0 ; i--)
{
if((1<<i) & x){
int tmp = x;
for(int j = i - 1; j >= 0; j--)
if(!((1<<j) & x)){
tmp = tmp ^ (1<<i) ^ (1<<j);
break;
}
if(tmp == x) continue;
vis[sg[tmp]] = 1;
}
}
for(int i = 0; ; i++)
if(!vis[i])
return i;
}
int main()
{
int t;
scanf("%d", &t);
for(int i = 0; i < (1<<20); i++)
sg[i] = dfs(i);
while(t--)
{
int n, flag = 0;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
int cnt, y = 0;
scanf("%d", &cnt);
for(int j = 0; j < cnt; j++)
{
int tmp;
scanf("%d", &tmp);
y = y | (1 << (20 - tmp));
}
flag ^= sg[y];
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}