题目链接 \(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. java 中的打印流

    package cn.zhou; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.F ...

  2. LODOP.FORMAT格式转换【回调和直接返回值】

    Lodop中有一些格式转换函数,这些函数和其他众多函数一样,c-lodop需要使用回调函数On_Return返回,Lodop插件方式直接返回,通常混合部署,写法要兼容两个控件.可以用if (LODOP ...

  3. Stack Pointer Tracker

    在Intel 64与IA-32架构中,存在一类用于跳转到以及跳出程序段的指令:PUSH.POP.CALL.LEAVE与RET.这些指令可以在没有其余指令的干预下隐式地更新栈寄存器(ESP),维护栈内的 ...

  4. Eclipse环境配置与快捷命令

    1.VS.Chrome.Eclipse调试命令对比: VS: F5: 继续运行 F10: 单步执行 F11: 进入函数内部 Shift + F11: 由函数内部返回调用处 Chrome: F8: 继续 ...

  5. luogu P1816 【忠诚】

    话说许多dalao都采取线段树A题可本蒟蒻不会啊, 暴力的我想出了暴力解法(快排) #include<cstdio> #include<algorithm> using nam ...

  6. [UOJ86]mx的组合数——NTT+数位DP+原根与指标+卢卡斯定理

    题目链接: [UOJ86]mx的组合数 题目大意:给出四个数$p,n,l,r$,对于$\forall 0\le a\le p-1$,求$l\le x\le r,C_{x}^{n}\%p=a$的$x$的 ...

  7. ExaWizards 2019

    AB:div 3 AB??? C:div 1 C???场内自闭的直接去看D.事实上是个傻逼题,注意到物品相对顺序不变,二分边界即可. #include<iostream> #include ...

  8. web scraper——安装【一】

    准备工作 工欲善其事必先利其器,既然是要安装web scraper一些***的工具是必然不可缺少的,如果没有的话,先下载个蓝灯用用吧. 蓝灯最新版下载地址 下载安装完成后双击打开即可,这时候会弹出一个 ...

  9. Aizu2130-Billion Million Thousand-dp

    用dp求出最大的表达,再用dp求出.//然而并没有想出来 #include <cstdio> #include <string> #include <algorithm& ...

  10. F - Count the Colors ZOJ - 1610 线段树染色(染区间映射)

    题意:给一段0-8000的线段染色 问最后 颜色x 有几段 题解:标准线段树  但是没有push_up  最后查询是单点按顺序查询每一个点 考虑过使用区间来维护不同的线段有多少种各色的线段  思路是 ...