题目描述

小E 与小W 进行一项名为“E&D”游戏。

游戏的规则如下: 桌子上有2n 堆石子,编号为1..2n。其中,为了方便起见,我们将第2k-1 堆与第2k 堆 (1 ≤ k ≤ n)视为同一组。第i堆的石子个数用一个正整数Si表示。 一次分割操作指的是,从桌子上任取一堆石子,将其移走。然后分割它同一组的另一堆 石子,从中取出若干个石子放在被移走的位置,组成新的一堆。操作完成后,所有堆的石子 数必须保证大于0。显然,被分割的一堆的石子数至少要为2。 两个人轮流进行分割操作。如果轮到某人进行操作时,所有堆的石子数均为1,则此时 没有石子可以操作,判此人输掉比赛。

小E 进行第一次分割。他想知道,是否存在某种策 略使得他一定能战胜小W。因此,他求助于小F,也就是你,请你告诉他是否存在必胜策略。 例如,假设初始时桌子上有4 堆石子,数量分别为1,2,3,1。小E可以选择移走第1堆, 然后将第2堆分割(只能分出1 个石子)。接下来,小W 只能选择移走第4 堆,然后将第3 堆分割为1 和2。最后轮到小E,他只能移走后两堆中数量为1 的一堆,将另一堆分割为1 和1。这样,轮到小W 时,所有堆的数量均为1,则他输掉了比赛。故小E 存在必胜策略。

输入输出格式

输入格式:

第一行是一个正整数T(T ≤ 20),表示测试数据数量。接下来有T组 数据。 对于每组数据,第一行是一个正整数N,表示桌子上共有N堆石子。其中,输入数据保 证N是偶数。 第二行有N个正整数S1..SN,分别表示每一堆的石子数。

输出格式:

包含T 行。对于每组数据,如果小E 必胜,则输出一行”YES”,否则 输出”NO”。

输入输出样例

输入样例#1:

2
4
1 2 3 1
6
1 1 1 1 1 1
输出样例#1:

YES
NO
【数据规模和约定】
对于20%的数据,N = 2;
对于另外20%的数据,N ≤ 4,Si ≤ 50;
对于100%的数据,N ≤ 2×104,Si ≤ 2×109。

应该一看就是求sg函数吧。。
首先是我打表sg函数的代码。
 #include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; const int maxn=; int T,n;
int sg[maxn][maxn];
int S[]; void calc(int x,int y){
memset(S,,sizeof S);
if(x>)
for(int i=;i<=(x>>);i++)
S[sg[i][x-i]]=;
if(y>)
for(int i=;i<=(y>>);i++)
S[sg[i][y-i]]=;
for(int i=;;i++)
if(!S[i]){
sg[x][y]=sg[y][x]=i;
return;
}
} void get_sg(){
for(int i=;i<=;i++)
for(int j=;j<=i;j++){
calc(i,j);
printf("%d %d %d\n",i,j,sg[i][j]);
}
for(int i=;i<=;i++){
for(int j=;j<=;j++) printf("%d ",sg[i][j]);
puts("");
}
} int main(){
get_sg();
return ;
}

然后是一段长时间的懵逼。。。

最后推出了这样一个求sg函数的规律

 int sg(int x,int y) {
ll tmp=;
for(int i=;;i++,tmp<<=)
if((x-)%tmp<(tmp>>)&&(y-)%tmp<(tmp>>)) return i;
}

完整代码大概是这样的,很显然吧。

 #include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; typedef long long ll;
int T,n; int sg(int x,int y) {
ll tmp=;
for(int i=;;i++,tmp<<=)
if((x-)%tmp<(tmp>>)&&(y-)%tmp<(tmp>>)) return i;
} int main() {
int T;
scanf("%d",&T);
int x,y,ans;
while(T--) {
scanf("%d",&n); n>>=;
ans=;
for(int i=;i<=n;i++) {
scanf("%d%d",&x,&y);
ans^=sg(x,y);
}
if(ans) puts("YES");
else puts("NO");
}
return ;
}

luoguP2148 [SDOI2009]E&D [sg函数][组合游戏]的更多相关文章

  1. Nim 游戏、SG 函数、游戏的和

    Nim游戏 Nim游戏定义 Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”(以下简称ICG).满足以 ...

  2. bzoj 1228 [SDOI2009]E&D SG函数打表 找规律

    题目链接 Description 桌子上有2n 堆石子,编号为1..2n.将第2k-1 堆与第2k 堆(1 ≤ k ≤ n)为同一组.第i堆的石子个数用一个正整数Si表示.一次分割操作指的是,从桌子上 ...

  3. 【转】博弈—SG函数

    转自:http://chensmiles.blog.163.com/blog/static/12146399120104644141326/ http://blog.csdn.net/xiaofeng ...

  4. 【转】博弈问题及SG函数(真的很经典)

    博弈问题若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需要 ...

  5. SG函数

    入门一: 首先来玩个游戏,引用杭电课件上的: (1) 玩家:2人:(2) 道具:23张扑克牌:(3) 规则:游戏双方轮流取牌:每人每次仅限于取1张.2张或3张牌:扑克牌取光,则游戏结束:最后取牌的一方 ...

  6. (转)博弈问题与SG函数

    博弈问题若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需要 ...

  7. 从SG函数浅谈解决博弈问题的通法

    基于笔者之前对于几种二元零和博弈游戏的介绍,这里将其思想进行简单的提炼,并引出解决这类二元零和博弈游戏的强大工具——SG函数. 其实对于博弈游戏如Bash.Nim等基本类型,异或一些比较高级的棋类游戏 ...

  8. SG函数(转自百度百科)

    给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移 动者判负.事实上,这个游戏可以认为是所有Impartial Combinatorial Games的抽象 ...

  9. (转)博弈 SG函数

    此文为以下博客做的摘要: https://blog.csdn.net/strangedbly/article/details/51137432 ---------------------------- ...

随机推荐

  1. uni-app——小程序插件使用wx.createSelectorQuery()获取不到节点信息

    发现小程序一个bug, 在小程序插件中使用wx.createSelectorQuery()获取不到节点信息,需要在后面加入in(this) 例如: const query = wx.createSel ...

  2. jq动画效果慢慢滚动到固定位置

    function contentTop(top){ $('body,html').animate({ scrollTop: top }, 500 ); } 获取元素top传入即可 contentTop ...

  3. 深入理解dijkstra+堆优化

    深入理解dijkstra+堆优化 其实就这几种代码几种结构,记住了完全就可以举一反三,所以多记多练多优化多思考. Dijkstra   对于一个有向图或无向图,所有边权为正(边用邻接矩阵的形式给出), ...

  4. js匿名函数测试

    js匿名函数测试 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  5. 4.Grafana展示监控数据

    Grafana是什么?我们知道Node_export监控服务器状态,但是没有具体的展示,简单来说,Grafana的主要作用就是对监控的数据进行图形化展示. docker部署 grafana我们这里采用 ...

  6. TP5.1/TP框架的访问控制,访问不存在的模块、控制器、方法等控制

    TP框架的访问控制,默认模块.控制器.方法等 在tp框架中,config文件夹下的app.php文件可以设置默认的空模块名,默认的空控制器名. 举例:以上项目中有admin.common.api.er ...

  7. 如何在webpack开发中利用vue框架使用ES6中提供的新语法

    在webpack中开发,会遇到一大推问题,特别是babel6升级到babel7,要跟新一大推插件,而对于安装babel的功能就是在webpack开发中,vue中能够是用ES6的新特性: 例如ES6中的 ...

  8. Cocos2d-x在Windows平台环境的搭建

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. windows平台下配置Cocos2d-X引擎所需的压缩文件和可执行文件,如下: 下载链接: adt:    http://tools.a ...

  9. 基于MFC的Media Player播放器的制作(3---功能实现)

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 下面我们试试一下,按下退出Button退出播放器的功能: 首先,我们双击退出Button按钮,就会弹出下图的框: 上面的弄好之后我们就实现 ...

  10. Tomcat启动脚本(2)catalina.bat

    @echo off rem Licensed to the Apache Software Foundation (ASF) under one or more rem contributor lic ...