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 博弈论 ...
随机推荐
- linux搭建ntp时间同步服务
1.NTP简介 NTP(Network Time Protocol,网络时间协议)用来使计算机时间同步的一种协议.它可以使计算机对其服务器或时钟源做同步化,它可以提供高精准度的时间校正(LAN上与标准 ...
- 聊聊Lock接口的lock()和lockInterruptible()有什么区别?
lock()和lockInterruptible()都表示获取锁,唯一区别是,当A线程调用lock()或lockInterruptible()方法获取锁没有成功而进入等待锁的状态时,若接着调用该A线程 ...
- 面试官:我把数据库部署在Docker容器内,你觉得如何?
开源Linux 一个执着于技术的公众号 上一篇:CentOS 7上搭建Zabbix4.0 近2年Docker非常的火热,各位开发者恨不得把所有的应用.软件都部署在Docker容器中,但是您确定也要把数 ...
- Docker系列教程02-操作Docker容器
简介 通过前面的学习,相信您已经对镜像有所了解,是时候学习容器了. 容器是Docker的另一个核心概念.简单来说,容器是镜像的一个运行实例.正如从虚拟机模板上启动VM一样,用户也同样可以从单个镜像上启 ...
- Python 什么是flask框架?快速入门
一:Python flask框架 前言 1.Python 面向对象的高级编程语言,以其语法简单.免费开源.免编译扩展性高,同时也可以嵌入到C/C++程序和丰富的第三方库,Python运用到大数据分析. ...
- .NET混合开发解决方案15 WebView2控件集成到WinForm程序编译后的文件及结构说明
系列目录 [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...
- Vue-router(前端路由)的两种路由模式
Vue的两种路由模式: hash.history:默认是hash模式: 前端路由(改变视图的同时不会向后端发出请求) 一.什么是hash模式和history模式? hash模式:是指url尾巴后的#号 ...
- Arthas常用功能及一次线上问题排查
一.Arthas简介 Arthas是Alibaba开源的Java诊断工具,功能很强大,它是通过Agent方式来连接运行的Java进程.主要通过交互式来完成功能. https://arthas.aliy ...
- CefSharp 白屏问题
原文 现象 我正在使用 cefsharp + winform 建立一个桌面程序用于显示网页.使用过程中程序会突然白屏,经过观察发现,在网页显示GIF动图时,浏览器子程序会突然占用较高内存(从80M上升 ...
- mysql外键与表查询
目录 自增特性 外键 外键关系 外键创建 外键的约束效果 级联更新级联删除 多对多关系 一对一关系 表查询关键字 select与from where筛选 group by分组 练习 关系练习 查询练习 ...