题目链接 \(Click\) \(Here\)

蒟蒻的人生第一道博弈论。真吉尔难啊。。。。

通常的博弈论写法似乎都是\(SG\)函数打表猜规律。本蒻其实本来想学一下博弈论的证明的,但后来发现果然还是打表快速又好用。

这个题中的模型可以拆分成\(n/2\)个游戏。对每个游戏的每堆石子单独打表,求其\(SG\)函数,可以得到结论:大小为\(N\)的石子堆,其拆分为两堆后对应的后继\(SG\)函数\(mex\)值为\(N-1\)。最终利用\(SG\)函数的性质,把每个游戏的\(SG\)函数合并,就是所求最初状态的\(SG\)函数。

打表代码:(感谢 @FlashHu 的题解

#include<cstdio>
#include<bitset>
#include<iostream>
using namespace std; const int N = 10;
const int M = N + 1;//随便调大小 int ans[M][M];
bitset <M> s[M]; int mex (bitset <M> b) {
int res = 0;
while (b[res]) ++res;
return res;
} int main () {
for(int i = 2; i <= N; ++i) {
for (int j = 1, k = i - 1; k; ++j, --k) {
s[i].set (ans[j][k] = mex (s[j] | s[k]));//枚举合并
}
}
for (int i = 0; i < N; ++i) printf ("%3d", i); printf ("\n");
for (int i = 1; i < N; ++i){//输出矩阵
printf ("%2d:", i);
for (int j = 1; i + j <= N; ++j) {
printf ("%3d", ans[i][j]);
}
printf ("\n");
}
for(int i = 1; i <= N; ++i) {//输出对于每一个a,所有c+d=a的(c,d)的SG值集合
printf ("%2d:SG%d ", i, mex (s[i]));
cout << s[i] << endl;
}
return 0;
}

\(STD:\)

#include <bits/stdc++.h>
using namespace std; int T, n, x, y, z, cnt, ans; int main () {
cin >> T;
while (T--) {
ans = 0;
cin >> n; n >>= 1;
while (n--) {
cnt = 0;
cin >> y >> z;
x = (y - 1) | (z - 1);
while (x & 1) {
++cnt;
x >>= 1;
}
ans ^= cnt;
}
puts (ans ? "YES" : "NO");
}
return 0;
}

注意最终求的\(cnt\),其实也就是把两堆石子的\(SG\)合并,得到的单个游戏的\(SG\)函数值。

Luogu P2148 [SDOI2009]E&D的更多相关文章

  1. Luogu P2148 [SDOI2009]E&D (sg函数 博弈)

    题目 洛谷传送门 题解 打表找sgsgsg规律. 严谨证明见:纳尔的博客 CODE #include <bits/stdc++.h> using namespace std; int sg ...

  2. 【题解】Luogu P2157 [SDOI2009]学校食堂

    原题传送门:P2157 [SDOI2009]学校食堂 一看题目就知道是状压dp 设f[i][j][k]表示第1到i-1个人都吃完了饭,第i个人以及后面的7个人是否打饭的状态为j,当前最后打饭的人的编号 ...

  3. p2148 [SDOI2009]E&D

    传送门 分析 https://www.luogu.org/blog/flashblog/solution-p2148 代码 #include<bits/stdc++.h> using na ...

  4. 【luogu P1972 [SDOI2009]HH的项链】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1972 真是不懂为什么要卡莫队! #include <cmath> #include <cs ...

  5. luogu P2154 [SDOI2009]虔诚的墓主人

    luogu 下面记一个点上下左右点数分别为\(u_i,d_i,l_i,r_i\) 枚举每个中间点太慢了,考虑枚举两个点之间横的一条线段,这里面的点左边点数目都相同,右边点数目都相同,然后只要查一下区间 ...

  6. Luogu P2149 [SDOI2009]Elaxia的路线(最短路+记忆化搜索)

    P2149 [SDOI2009]Elaxia的路线 题意 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们必须合理地安排两个人在一起的 ...

  7. 【题解】Luogu P2153 [SDOI2009]晨跑

    原题传送门 一眼应该就能看出是费用流 因为每个交叉路口只能通过一次,所以我们进行拆点,连一条流量为1费用为0的边 再按照题目给的边(是单向边)建图 跑一下MCMF就行了 拆点很套路的~ #includ ...

  8. 洛谷P2148 [SDOI2009]E&D(博弈论)

    洛谷题目传送门 先安利蒟蒻仍在施工的博弈论总结 首先根据题目,石子被两两分组了,于是根据SG定理,我们只要求出每一组的SG值再全部异或起来就好啦. 把每一对数看成一个ICG,首先,我们尝试构造游戏的状 ...

  9. 【题解】Luogu P1972 [SDOI2009]HH的项链

    原题传送门 莫队入门题 我博客里对莫队的介绍 很多人说这题卡莫队,但窝随便写了一个程序就过了qaq(虽说开了氧化) 我们在排序询问时,普通是这样qaq inline bool cmp(register ...

随机推荐

  1. 二、两条Linux删除数据跑路命令

    一.rm rm -rf / 无提示循环删除根目录,,删除存在被恢复的可能 二.dd dd if=/dev/urandom of=/dev/hda1 随机填写数据到相应分区,直到填满为止.重写后的分区无 ...

  2. js 插件使用总结

    1:树形菜单插件: z-tree 和dtree 2: 弹窗插件layer 3: 前端ui框架ace ,  h-ui , layui 4:产品设计图绘制软件Axure和Mockplus(推荐)

  3. jqprint控件使用

    /*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license //@ sourceMappingURL ...

  4. Linux命令替换字符串

    :%s/str1/str2/ 用str2替换str1

  5. 使用binlog,实现MySQL数据恢复

    mysql的binlog日志,用于记录数据库的增.删.改等修改操作,默认处于关闭状态.使用binlog实现数据恢复的条件为 1.binlog日志功能已开启 2.若binlog在数据库创建一段时候后开启 ...

  6. SpringBoot远程接口调用-RestTemplate使用

    在web服务中,调度远程url是常见的使用场景,最初多采用原生的HttpClient,现采用Spring整合的RestTemplate工具类进行.实操如下: 1. 配置 主要用以配置远程链接的相关参数 ...

  7. UOJ356 [JOI2017春季合宿] Port Facility 【启发式合并】【堆】【并查集】

    题目分析: 好像跑得很快,似乎我是第一个启发式合并的. 把玩具看成区间.首先很显然如果有两个玩具的进出时间有$l1<l2<r1<r2$的关系,那么这两个玩具一定在不同的栈中间. 现在 ...

  8. Codeforces963C Frequency of String 【字符串】【AC自动机】

    题目大意: 给一个串s和很多模式串,对每个模式串求s的一个最短的子串使得这个子串中包含至少k个该模式串. 题目分析: 均摊分析,有sqrt(n)种长度不同的模式串,所以有关的串只有msqrt(n)种. ...

  9. spi slaver接口的fpga实现

    前言 spi从机接口程序,数据位8bit,sck空闲时低电平,工作时第一个沿数据传输.只有一个从机,cs低电平片选,slaver开始工作. 流程: 接口定义: 编码实现:(版权所有,请勿用于商业用途, ...

  10. 【cf849D】Rooter's Song(思维)

    D. Rooter's Song 题意 x轴.y轴上有n个人,第i个人\(g_i==1\)则坐标为\((p_i,0)\)否则\((0,p_i)\),\(t_i\)秒后垂直所在坐标轴出发,到达边界x=w ...