题目链接

一个n行20列的棋盘。 每一行有若干个棋子。 两人轮流操作, 每人每次可以将一个棋子向右移动一个位置, 如果它右边有一个棋子, 就跳过这个棋子, 如果有若干个棋子, 就将这若干个都跳过。 但是棋子不能移出边界。

如果没有办法移动了, 就算输。 问你先走的能否赢。

只有20列, 所以预处理出所有状态的sg值。 然后直接异或就好了。

然后sg[(1<<20)-1] = 0, 这是必输态, 其他的都可以dfs出来, 具体看代码。

#include <bits/stdc++.h>

using namespace std;
#define pb(x) push_back(x)
#define ll long long
#define mk(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define mem(a) memset(a, 0, sizeof(a))
#define rson m+1, r, rt<<11
#define mem1(a) memset(a, -1, sizeof(a))
#define mem2(a) memset(a, 0x3f, sizeof(a))
#define rep(i, n, a) for(int i = a; i<n; i++)
#define fi first
#define se second
typedef pair<int, int> pll;
const double PI = acos(-1.0);
const double eps = 1e-;
const int mod = 1e9+;
const int inf = ;
const int dir[][] = { {-, }, {, }, {, -}, {, } };
int sg[<<];
int mex(int x)
{
if(~sg[x])
return x;
bool vis[];
memset(vis, false, sizeof(vis));
for(int i = ; i < ; i++) {
if(((<<i)&x)== && ((<<(i+))&x)) {
int j;
for(j = i + ; j < ; j++) {
if(!(<<j&x))
break;
}
for(int k = i+; k <= j; k++) {
int sta = x^(<<i)^(<<k);
if(sta>=(<<))
break;
mex(sta);
vis[sg[sta]] = ;
}
}
}
for(int i = ; i < ; i++)
if(!vis[i])
return sg[x] = i;
}
void init()
{
mem1(sg);
sg[(<<)-] = ;
for(int i = ; i < (<<); i++) {
if(sg[i] == -) {
mex(i);
}
}
}
int main()
{
init();
int t, n, m, x;
cin>>t;
while(t--) {
cin>>n;
int ans = ;
for(int i = ; i < n; i++) {
scanf("%d", &m);
int sta = ;
while(m--) {
scanf("%d", &x);
sta |= (<<(-x));
}
ans ^= sg[sta];
}
if(ans) {
puts("YES");
} else {
puts("NO");
}
}
}

最新文章

  1. Lucene系列-FieldCache
  2. Windows GUI代码与Windows消息问题调试利器
  3. 移动WEB开发中媒体查询里的width, device-width, resolution
  4. onethink常用标签的使用示例
  5. One Class SVM, SVDD(Support Vector Domain Description)(转)
  6. Android手机部分名词浅谈
  7. Eclipse配置C/C++开发环境
  8. malloc函数具体解释
  9. vbird BASH学习
  10. ARP协议的报文格式 转自n哖苡逅
  11. 常用的Linux操作命令(一)
  12. java 采用MD5加密解密
  13. Python 基于TK 文本编辑器
  14. LVS-NAT搭建HTTP及HTTPS
  15. 201521123004 《Java程序设计》第7周学习总结
  16. 使用Spring Boot Actuator、Jolokia和Grafana实现准实时监控
  17. Bokeh
  18. Python装饰器的另类用法
  19. Windows 10 IoT Core 17127 for Insider 版本更新
  20. ActiveReports 大数据分析报告:2018中国电影再次迎来黄金时代

热门文章

  1. jQuery基础---Ajax基础教程(二)
  2. sql 添加字段备注和查看已添加表的备注
  3. Cordova了解
  4. C++ buffer缓冲区的秘密
  5. BZOJ 4011: [HNOI2015]落忆枫音( dp )
  6. Python读取PDF内容
  7. python 中去除BOM头
  8. LinkList的实现
  9. ODI Studio拓扑结构的创建与配置(Oracle)
  10. 全局键盘钩子(WH_KEYBOARD)