P2575 高手过招 题解
我们考虑如何把问题转换成博弈论来求解。
我们对于每一行之前都加上一个空格。
设原来这一行的空格个数是 \(C\) ,那么此时空格个数变成 \(C + 1\) 。
然后按照从左到右的顺序给每一个空格标号。
接着构建出一个数组 \(p_i\) 。
\(p_i\) 表示从第 \(i\) 个空格开始后面有多少个连续的棋子。
比如像这样的一行棋盘:
\]
我们先在前面加上一个空格
\]
不难发现,此时我们的 \(p\) 数组是这样的:
\]
我们可以发现如果我们移动第 \(2\) 个棋子会变成这样。
p = \{0,0,1,0,0,3,1,1\}
\]
同理,我们可以发现所有的操作都可以把转换成 \(p\) 上的操作。
我们尝试着把 \(p_i\) 当作是第 \(i\) 个阶梯上的石子个数。
题目上的限制是移到右边最近的一个空格上。
让后通过模拟 \(2\sim 4\) 的棋子(再次不在给出结果)可以发现相当于是指定棋子向上一层移动。
(当然,最多只会向上一层移动,可以证明不会影响到其他的地方)
当所有的棋子变成这样时就结束了
\]
同理,也可以对应到所有的石子被移到最高层。
所以就是个 阶梯 \(\textbf{Nim}\) 。
Code
#include <bits/stdc++.h>
#define file(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout)
#define quad putchar(' ')
#define Enter putchar('\n')
const int N = 30;
int T, n, ans2, a[N], ans1;
signed main(void) {
// file("P2575");
std::cin >> T;
for (int test = 1; test <= T; test ++) {
std::cin >> n;
ans2 = 0;
for (int i = 1, m; i <= n; i++) {
scanf("%d", &m);
memset(a, 0, sizeof(a)); ans1 = 0;
int cnt = 20 - m + 1;
for (int i = 1, pos; i <= m; i++) {
scanf("%d", &pos);
a[pos] = 1;
}
int tot = 0;
for (int i = 1; i <= 20; i++) {
if (a[i] == 0) {
cnt --;
if (cnt % 2 == 1)
ans1 ^= tot;
tot = 0;
} else tot ++;
}
ans2 ^= ans1;
}
if (ans2 == 0) std::cout << "NO" << std::endl;
else std::cout << "YES" << std::endl;
}
}
P2575 高手过招 题解的更多相关文章
- 洛谷P2575高手过招——SG函数初试
题目:https://www.luogu.org/problemnew/show/P2575 第一次用SG函数解决问题,有许多不熟练的地方: 试图按自己的理解写一个dfs,结果错了(连题都没读对,以为 ...
- Luogu P2575 高手过招
题目链接 \(Click\) \(Here\) 关键在于转换成阶梯\(Nim\)的模型.最开始把题目看错了,理解正确后发现棋子可以向后跳不止一位,那么就比较简单了. 这里把空格看做阶梯,棋子看做硬币, ...
- P2575 高手过招
传送门 直接搞好像搞不了 考虑转换模型 显然每一行棋子不会跑到其他行.. 所以可以把每一行的情况看成一个子博弈 显然整个答案就是每一行的SG值的异或和 不懂的回去学SG函数... 考虑怎么分析一行的状 ...
- 洛谷 [P2575] 高手过招
SG函数+状压记忆化搜索 观察题目发现,每一行都是独立的,只要处理出来每一行的SG值,异或起来就好 每一行的SG值可以用状压+记忆化搜索的方法来求,对位运算技术是个很大的考验 注意SG值要预处理出来, ...
- 洛谷$P$2575 高手过招 博弈论
正解:博弈论 解题报告: 传送门! 阿西$gql$又双叒被题意杀辣,,,再不好好学语文吃枣药丸$TT$ 然后在$get$规则之后还有什么问题嘛,,, 就和这题差不多了,一个$easy$的阶梯问题罢辽, ...
- Luogu 2575 高手过招-SG函数
Solution SG函数跑一遍就过了ouo Code #include<cstring> #include<cstdio> #include<algorithm> ...
- LuoguP2575 高手过招(博弈论)
空格数变吗?不变呀 阶梯博弈阶梯数变吗?不变呀 那这不就阶梯博弈,每行一栋楼,爬完\(mex\)就可以了吗? #include <iostream> #include <cstdio ...
- 2018.12-2019.1 TO-DO LIST
AC自动机 P3808 [模板]AC自动机(简单版)(完成时间:2018.12.06) P3796 [模板]AC自动机(加强版)(完成时间:2018.12.06) P2444 [POI2000]病毒( ...
- 某大佬的TODOLIST
回文串 manacher(完成时间:2018.12.10)回文串计数最长双回文串(完成时间:2018.12.10) 扫描线 棋盘制作巨大的牛棚玉蟾宫某个blog 汉诺塔相关 新汉诺塔SHOI 博弈论 ...
随机推荐
- shell基础知识讲解
第1章 shell基础 1.1 什么叫做shell编程 shell编程也叫做bash高级编程语法 1.2 常见的shell命令解释器 bash redhat和centos使用 d ...
- Selenium3自动化测试【29】文件上传
日常在访问页面时,文件上传与下载操作也常常用到,因此在Web自动化测试中也会遇到文件上传的情况.针对上传功能,WebDriver并没有提供对应的方法.针对上传文件的场景主要有两种解决思路: 同步视频知 ...
- React ant table 用 XLSX 导出excel文件
近期做了一个react ant design 的table转换成excel 的功能 总结下 首先我们会自己定义下 antdesign 的table的columns其中有可能有多语言或者是render方 ...
- Django学习——静态文件配置、request对象方法、pycharm如何链接数据库、Django如何指定数据库、Django orm操作
静态文件配置 # 1.静态文件 网站所使用的已经提前写好的文件 css文件 js文件 img文件 第三方文件 我们在存储静态文件资源的时候一般默认都是放在static文件夹下 # 2.Django静态 ...
- git 配置别名简化命令行和删除别名
废话不多说直接上添加别名语法 加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用. git config --global alias.<自己想要的命令行> & ...
- Linux-ssh-key验证
ssh登录验证方式介绍 ssh服务登录的常用验证方式 用户/口令 基于密钥 基于用户和口令登录验证 客户端发起ssh请求,服务器会把自己的公钥发送给用户 用户会根据服务器发来的公钥对密码进行加密 加密 ...
- 中间件漏洞之IIS
IIS中间件漏洞 我们常见的中间件有IIS.Apache.Nginx,其中IIS中间件有什么漏洞呢? IIS 短文件名漏洞: 漏洞产生的原因是为了兼容MS-DOS程序,windows为文件名较长的文件 ...
- .NET混合开发解决方案11 WebView2加载的网页中JS调用C#方法
系列目录 [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...
- Python3获取5000个元素的单字符表
技术背景 此前考虑过一个问题,有没有办法获取到python里面所有定义好的单字符的表,比如我们获取5000个不一样的单字符,但是常用的chr(number)的方法里面包含了太多的非字母条目,比如缩进换 ...
- Volatile的学习
首先先介绍三个性质 可见性 可见性代表主内存中变量更新,线程中可以及时获得最新的值. 下面例子证明了线程中可见性的问题 由于发现多次执行都要到主内存中取变量,所以会将变量缓存到线程的工作内存,这样当其 ...