题目链接 \(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. Vue之双向数据绑定

    demo.html <!DOCTYPE html> <html lang="en" xmlns:v-bind="http://www.w3.org/19 ...

  2. TP5系统变量输出

    1.超全局变量 模板中: {$Think.sever.server_name}              //全部小写,输出blog.cn 控制器: $_SERVER['SERVER_NAME']  ...

  3. 如何消除原生Android网络状态上的惊叹号

    喜欢使用原生Android系统的朋友可能会发现自己的状态栏信号图标上经常有一个惊叹号标志. 这是怎么回事呢?原因是Android为了对网络状态进行检测,采用了一种叫做captive detection ...

  4. crontab注意%

    %在其中有特殊含义表示开始新行 十分坑 例子:写一个定时任务用到date命令 crontab -e * * * * * date +%F >> /tmp/time.log 查看我们的cro ...

  5. kvm 一些web管理3方工具

    OpenNebula  Proxmox VE 

  6. 浅析Android设备中grep命令处理流程

    2017-04-18   概述     在TV开发板中,可以在串口中直接使用grep命令.这是因为在/system/bin/下有一个'grep'链接.这个链接指向'/system/bin/toolbo ...

  7. BZOJ3133[ballmachine]——倍增+优先队列

    题目描述 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树滚下.如果同时有多个点可以走,那么会选择编号最小的节点所在路径的方向.比如依次在树根4放2个 ...

  8. 允许外网访问MySQL

    1:设置mysql的配置文件     /etc/mysql/my.cnf     找到 bind-address  =127.0.0.1  将其注释掉://作用是使得不再只允许本地访问:  重启mys ...

  9. 微信小程序API 文档快速参考索引

    内容那么多,这个页面到底做了什么? 第一:解决微信文档APi文档使用不便: 第二:解决了内容搜索与索引:—— 最好是写成全文索引文档,但是比较需要时间,而且更新是一件麻烦的事:所以以下是直接 连接官网 ...

  10. Android studio 3.1.2报错,no target device found

     Android studio 3.1.2的Android monitor改为Android profiler,直接点这个就可以真机调试,在手机安装相应文件 第二次启动时,再次报错,找不到设备,点一下 ...