Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1228

Solution:

感觉自己对博弈论的理论一直了解得不够透彻

一篇讲原理的文章:Sprague-Grundy定理是怎么想出来的

现在发现其实可以将SG函数的合成看作为Nim游戏,也顺便能证明其异或运算的正确性了

对于此题,发现每两堆之间明显是独立的,于是只要求出每组的SG值再异或即可

但直接求解SG复杂度过高,于是采取打表找规律的方式

0出现条件:i,j均%2=1

1出现条件:i,j均%4=1或2

2出现条件:i,j均%8=1或2或3或4
 

得到sg(i,j)=k的必要条件:

(i-1)%2^(k+1) < 2^k && (j-1)%2^(k+1) < 2^k

这样便能在O(logS)时间内求出SG函数

Code:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
int t,n,x,y; int SG()
{
ll pro=;
for(int i=;;++i,pro<<=)
if(((x-)&(pro-))<(pro>>) && ((y-)&(pro-))<(pro>>)) return i;
} int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);int res=;
for(int i=;i<=n/;i++)
scanf("%d%d",&x,&y),res^=SG();
puts(res?"YES":"NO");
}
}

Review:

1、求解A%2^k的技巧:

直接求解 A&(2^k - 1) 即可,大大优化常数

2、求解SG函数的一般步骤:

(1) 使用 数组f 将 可改变当前状态的方式 记录下来。(一般SG函数成规律性变化)

(2) 然后我们使用 另一个数组 将当前状态x 的后继状态标记。

(3) 最后模拟mex运算,也就是我们在标记值中 搜索 未被标记值 的最小值,将其赋值给SG(x)。

3、如果求解SG函数复杂度过高,考虑打表找规律的方式

[BZOJ 1228] E&D的更多相关文章

  1. bzoj 1228: [SDOI2009]E&D 阿达马矩阵

    1228: [SDOI2009]E&D Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 448  Solved: 240[Submit][Sta ...

  2. bzoj 1228 [SDOI2009]E&D(sg函数,找规律)

    Description 小E 与小W 进行一项名为“E&D”游戏.游戏的规则如下:桌子上有2n 堆石子,编号为1..2n.其中,为了方便起见,我们将第2k-1 堆与第2k 堆(1 ≤ k ≤ ...

  3. BZOJ 1228: [SDOI2009]E&D(SG定理)

    这道嘛,很容易就看出是个nim和,然后问题就是怎么算子问题的sg函数了 先暴力个表看下规律,很容易就找出来了~~~(百度空间又渣了,图贴不出来= =) 32 0 1 0 2 0 1 0 3 0 1 0 ...

  4. bzoj 1228 [SDOI2009]E&D

    sg表很好打,规律很不好找.... #include<bits/stdc++.h> #define LL long long #define fi first #define se sec ...

  5. BZOJ 1228 E&G(sg函数+找规律)

    把一对石子堆看出一个子游戏.打出子游戏的sg表找规律.. 这个规律我是一定找不出来的... 对于i,j,如果 (i-1)%pow(2,k+1) < pow(2,k) (j-1)%pow(2,k+ ...

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

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

  7. bzoj一句话题解

    发现好多人都在搞这个...本人也想来试试(Solved刚到70就搞这个靠不靠谱啊喂).会更新的.嗯. 1000-1029 1000 A+B problem (这个还需要一句话吗?). 1001 狼抓兔 ...

  8. BZOJ 题解continue

    1041 圆上的整点 暴力枚举 会超时 这道题很像之前一次noip模拟题(当时的我还太水了(虽然现在也很水)) x2+y2=R2 考虑变型 x2=(R+y)(R-y) int d=gcd(R,y) i ...

  9. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

随机推荐

  1. More on understanding sort_buffer_size

    There have been a few posts by Sheeri and Baron today on the MySQL sort_buffer_size variable. I want ...

  2. Fragmenttabhost的使用教程

    1.准备tab的图标,放到mipmap目录下面,大小64x64,准备2种,一种是选中的,一种是未选中的,如下图 2.重写fragmentabhost,防止调用fragment每次点击tab都要重新调用 ...

  3. ng的ngModel用来处理表单操作

    https://segmentfault.com/a/1190000009126012

  4. spring中@PropertySource注解的使用

    概述: The @PropertySource annotation provides a convenient and declarative mechanism for adding aPrope ...

  5. [06] 盒模型 + auto 居中 + 垂直合并

    1.盒模型 盒子模型有两种,分别是 ie 盒子模型和标准 w3c 盒子模型. 标准(W3C)模型中:CSS中的宽(width) = 内容 (content)的宽 CSS中的宽(width) = 内容( ...

  6. java中的构造块、静态块等说明

    一:这篇博客写的时候我在学校已经一个星期了,为什么又会想到写这le,因为这几天又在重新学下有关spring.myBatis的知识,其中在实例化sessionFactory的时候用到了静态块,虽然在学习 ...

  7. 【2016-09-27-DP小练】

    得分250..我真是个250... 犯了一些很搞笑的错.. f[i][j][k]表示第i个苹果,现在在j这个位置,还能用k次转移. 用i去更新i+1. 时间复杂度1000*2*30: 转移方程有个地方 ...

  8. bzoj 1060 贪心

    设根到每个叶子节点的距离为dis,比较容易的看出来,我们需要把这颗树的所有叶子节点的值都变成其中最大的内个,我们设为max,那么对于一颗子树来说,设其中dis值最大的为x,我们需要将这个子树根节点和子 ...

  9. javascript批量输入表单

    void((function(){ x=document.getElementsByTagName("a"); y = x[1] y.click() })()) void((fun ...

  10. 原生sql和django的事务控制

    def test(request): with connections['default'].cursor() as c: try: with transaction.atomic(using='de ...