Description


AKN玩游戏玩累了,于是他开始和同伴下棋了,玩的是跳棋!对手是wwx!这两位上古神遇在一起下棋,使得棋局变得玄幻莫测,高手过招,必有一赢,他们都将用最佳策略下棋,现在给你一个n*20的棋盘,以及棋盘上有若干个棋子,问谁赢?akn先手!

游戏规则是这样的:

对于一个棋子,能将它向右移动一格,如果右边有棋子,则向右跳到第一个空格,如果右边没有空格,则不能移动这个棋子,如果所有棋子都不能移动,那么将输掉这场比赛。

10%的数据T≤1,n≤1
另外10%的数据m≤1
100%的数据T≤100,n≤1000,m≤20,1≤pj≤20
By:Mul2016

Solution


显然每一行都是独立的,我们考虑求出每一行的sg
由于一定是20列,因此可以状压然后dfs预处理sg的值。然后就做完了

我才发现以前写的求sg函数的方法好像都是错的。由于桶是全局共用的,因此我们需要先求出后继状态的sg再取mex(具体看代码

Code


#include <stdio.h>
#include <string.h>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
#define fill(x,t) memset(x,t,sizeof(x))const int N=1048578;int rec[N],sg[N],n;void get_sg(int x) {if (~sg[x]) return ;rep(i,0,19) if (x&(1<<i)) {rep(j,i+1,19) if (!(x&(1<<j))) {int y=x; y^=(1<<i); y^=(1<<j);get_sg(y);break;}}// 这里要分开来写,以前都是合起来的╮(╯▽╰)╭rep(i,0,19) if (x&(1<<i)) {rep(j,i+1,19) if (!(x&(1<<j))) {int y=x; y^=(1<<i); y^=(1<<j);rec[sg[y]]=x;break;}}for (sg[x]=0;rec[sg[x]]==x;) sg[x]++;
}int main(void) {fill(sg,-1);rep(i,0,(1<<20)-1) get_sg(i);int T; for (scanf("%d",&T);T--;) {int n,sum=0; scanf("%d",&n);rep(i,1,n) {int m,p=0; scanf("%d",&m);rep(j,1,m) {int x; scanf("%d",&x);p|=1<<(x-1);}sum^=sg[p];}puts((!sum)?"NO":"YES");}return 0;
}

luogu2575 高手过招 sg函数相关推荐

  1. P2575 高手过招 (博弈、sg函数)

    题目链接 题面: 题解: 用sg函数把所有的状态打出来就好啦. 代码: #include<iostream> #include<cstdio> #include<cstr ...

  2. P2575 高手过招

    P2575 高手过招 题意: AKN玩游戏玩累了,于是他开始和同伴下棋了,玩的是跳棋!对手是wwx!这两位上古神遇在一起下棋,使得棋局变得玄幻莫测,高手过招,必有一赢,他们都将用最佳策略下棋,现在给你 ...

  3. 闲来无事刷水题、简单博弈论专题、sg函数、洛谷

    记 今天闲来无事,不想刷codeforces了,到洛谷提高组训练营找几道水题刷着玩玩(虽然自己早已过了打OI的年纪)- 简单博弈论专题 P1199 三国游戏 这么考虑,由于电脑总是不能让我搭配出当前能 ...

  4. 洛谷 P2575 高手过招

    题目描述 AKN玩游戏玩累了,于是他开始和同伴下棋了,玩的是跳棋!对手是wwx!这两位上古神遇在一起下棋,使得棋局变得玄幻莫测,高手过招,必有一赢,他们都将用最佳策略下棋,现在给你一个n*20的棋盘, ...

  5. 高手过招,洛谷之提高历练地,博弈论(3-6)

    正题 第6题:高手过招 这题主要运用的是模拟来查找Sg. 根据题意可以知道,当前行的状态可以用一个二进制数来表示,1表示有棋子,0表示没有棋子. 所以我们遍历每一位,如果当前这位有棋子,而且它的右边是 ...

  6. Trie树合并 + SG函数 ---- BZOJ4730. Alice和Bob又在玩游戏(动态开点Trie 树上全局异或标记 + 合并 + 博弈论)

    题目大题 题目大意: 解题思路: 首先我们对于子树u的SG函数为SG函数为SG函数为 ⨁是异或和\bigoplus是异或和⨁是异或和 SG[u]=mex{⨁w∈(w的父亲在u到v的路径上)SG[w]∣ ...

  7. 点分治问题 ----------- P3727 曼哈顿计划E[点分治+博弈SG函数打表找规律]

    题目链接 解题思路: 1.首先对于每个操作我们实际上是一个博弈问题 对于k=1的操作就是很基础的NIM游戏就是找到一条链的异或和为0 对于k=2的操作通过达打表找规律: 如果s是奇数那么偶数的SG函数 ...

  8. BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)

    Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 871  Solved: 365 [Submit][Status][Discuss] Descripti ...

  9. 一类SG函数递推性质的深入分析——2018ACM陕西邀请赛H题

    题目描述 定义一种有根二叉树\(T(n)\)如下: (1)\(T(1)\)是一条长度为\(p\)的链: (2)\(T(2)\)是一条长度为\(q\)的链: (3)\(T(i)\)是一棵二叉树,它的左子 ...

最新文章

  1. c#开发windows应用程序几个小技巧
  2. Java基础之Collection和Map
  3. luogu4462 异或序列
  4. C++(STL):04---智能指针之weak_ptr
  5. 在spring官网上下载历史版本的spring插件,springsource-tool-suite
  6. 堆排序(python实现)
  7. python实现给定一个单链表删除指定节点
  8. STM32 使用DMA+DAC+TIMER 输出正弦波
  9. DSP原理学习笔记--第十四章--DSP算法及其实现
  10. linux 控制音量大小,linux 控制音量大小
  11. Spark入门(一篇就够了)
  12. 【CPRI】(3)帧格式详解(重点)
  13. 微信如何自动搜索精准号码添加好友?导入软件完成自动加人
  14. 解决运行zebra时“Multiple command installs to node 4 of command”的问题
  15. 安装sklearn-poter遇到报错(TypeError:‘encoding‘ is an invalid keyword argument for this function)
  16. OC实例之汽车启动问题
  17. ADB控制安卓WIFI连接(斐讯R1联网指南)
  18. 红米k30 android版本,红米K30配置如何 红米K30手机参数配置及图赏
  19. S7-300/400 PLC 模拟量输入/输出的量程转换
  20. “谷歌百度一键搜索” -- 最方便的Chrome搜索插件

热门文章

  1. 联想yoga710闪屏问题
  2. 过滤器和拦截器的不同以及执行顺序和使用场景的总结
  3. Windows和Linux操作系统下关闭nginx的方法
  4. 饥荒服务器运行时cpu的占用,饥荒联机版服务器卡顿原因分析及解决教程 服务器卡怎么办_游侠网...
  5. 如何制作ogg格式的视频?解决办法!!!
  6. css如何实现让div中的多行文字居中显示
  7. redis存储java对象_Redis存储java对象
  8. 《Guns,Germs and Steel》Chapter 10:地理分异导致人类社会不同发展模式和速度进程
  9. [开题报告+任务书+论文+源码]基于Android平台的合肥市景区移动票务管理系统的设计与实现
  10. 闲谈Redis客户端Lettuce