Luogu P10501 Cutting Game 题解
博弈论经典题目,考虑使用 SG 函数解决。
但是这一题和有向图游戏的定义不同,在有向图游戏不能操作者判负,而这一题中操作出某个状态者判胜。因此,我们需要进行转化。经典做法是往前推直到推出必败态作为有向图游戏的终点。
我们考虑什么样的情况可以剪出 \(1\times 1\) 的纸条,显然,当且仅当在 \(1\times n\) 或 \(n\times 1\) 的纸条上可以剪出 \(1\times 1\) 的纸条。因此,这种情况下是先手必胜态。
往前推出必败态,就是要找到一个只能剪出 \(1\times n\) 或 \(n\times 1\) 的纸条的状态。不难发现在 \(2\times2,2\times3,3\times2\) 的纸条中都只能剪出 \(1\times n\) 或 \(n\times 1\) 的纸条,因此它们是必败态。以它们作为有向图游戏的终点,即可按照有向图游戏的方式处理。
我们考虑枚举每个状态在哪一行或者哪一列剪开,之后就是两个剪纸子问题,求出它们的 SG 函数的值后用有向图游戏和异或起来就是当前状态的一个后继状态的 SG 函数值,求 mex 就行了。
注意每一步不会直接剪出 \(1\times n\) 或 \(n\times 1\) 的纸条,因为会使对手直接获胜,所以代码实现时需要注意边界条件。下面给出转移式。
\]
使用记忆化搜索预处理实现。
#include <bits/stdc++.h>
using namespace std;
long long n,m,x[300000],sg[300][300];
bool vis[300][300];
long long dfs(long long n,long long m)
{
if(n==2&&m==2)return 0;
if(n==2&&m==3)return 0;
if(n==3&&m==2)return 0;
if(vis[n][m])return sg[n][m];
vis[n][m]=1;
for(int i=2;i<n-1;i++)x[dfs(i,m)^dfs(n-i,m)]=1;
for(int i=2;i<m-1;i++)x[dfs(n,i)^dfs(n,m-i)]=1;
long long mex=0;
while(x[mex])mex++;
for(int i=2;i<n-1;i++)x[dfs(i,m)^dfs(n-i,m)]=0;
for(int i=2;i<m-1;i++)x[dfs(n,i)^dfs(n,m-i)]=0;
return sg[n][m]=mex;
}
int main()
{
for(int i=2;i<=200;i++)
for(int j=2;j<=200;j++)dfs(i,j);
while(scanf("%lld%lld",&n,&m)!=-1)
{
if(sg[n][m])printf("WIN\n");
else printf("LOSE\n");
}
return 0;
}
Luogu P10501 Cutting Game 题解的更多相关文章
- 【luogu P5022 旅行】 题解
题目连接:https://www.luogu.org/problemnew/show/P5022 \(NOIP2018 DAY2T1\) 考场上只写了60分,很容易想到当 m = n - 1 时的树的 ...
- 【luogu P2831 愤怒的小鸟】 题解
题目链接:https://www.luogu.org/problemnew/show/P2831 写点做题总结:dp,搜索,重在设计状态,状态设的好,转移起来也方便. 对于一条抛物线,三点确定.(0, ...
- 【luogu P2827 蚯蚓】 题解
题目链接:https://www.luogu.org/problemnew/show/P2827 35分:暴力sortO(mnlogn). 80分:考虑到每次不好维护不被切的点+q,正难则反.改成维护 ...
- 【luogu P3959 宝藏】 题解
题目链接:https://www.luogu.org/problemnew/show/P3959 我只是心血来潮想学SA(考场上骗分总行吧). 这个题可以状压DP.爆搜+剪枝.有意思的还是随机化搜索( ...
- 【luogu P3410 拍照】 题解
题目链接:https://www.luogu.org/problemnew/show/P3410 这个题就是求一个最大权闭合图 在一个图中,一些点构成一个集合,且集合中的出边指向的终点也在这个集合中, ...
- 【luogu P1113 杂务】 题解
题目链接:https://www.luogu.org/problemnew/show/P1113 菜 #include <queue> #include <cstdio> #i ...
- 【luogu P4114 Qtree1】 题解
题目链接:https://www.luogu.org/problemnew/show/P4114 1.把边权转化到点权:选取连接这条边的两个点中较深的一个. 2.查询点到点之间的边权时,要从seg[x ...
- 【luogu P3979 遥远的国度】 题解
题目链接:https://www.luogu.org/problemnew/show/P3979 除了换根操作都是裸的树剖 所以换根时考虑: 1.我查询的根等于换的根:无影响 2.我查询的根是换的根的 ...
- 【luogu P2169 正则表达式】 题解
题目链接:https://www.luogu.org/problemnew/show/P2169 tarjan缩点 + SPFA 缩完点之后加边注意别写错. 也可以不用建两个图,可以在一张图上判断是否 ...
- 【luogu P2024 食物链】 题解
题目链接:https://www.luogu.org/problemnew/show/P2024 摘吊打集训队的九日dalao一句话 关于带有多个相对集合的全集,我们可以多开几倍的空间.每一倍的元素表 ...
随机推荐
- Springboot连接Greenplum,分页查询
1.springboot分页查询greenplum数据报错: org.mybatis.spring.MyBatisSystemException: nested exception is org.ap ...
- 使用Python可视化磁场
引言 随着科学技术的发展,物理学中的很多概念变得越来越复杂,但我们可以利用 Python 这一强大的工具,将一些抽象的物理现象变得更加直观易懂.今天,我们将以"磁场可视化"为主题, ...
- 使用Python计算并可视化长直导线产生的磁场
引言 大家好,今天我们来探讨一个有趣的话题--长直导线产生的磁场,并通过 Python 来进行计算和可视化.你可能会问,为什么要研究这个问题?其实,这是电磁学中的一个基础问题,理解了它,我们就能更好地 ...
- TCP连接(Netty)
启动类增加 public static void main(String[] args) { SpringApplication application = new SpringApplication ...
- Java序列化:为何必须实现Serializable并显式指定serialVersionUID?
结论先行 实现Serializable接口是Java对象序列化的基本前提,没有它JVM会直接拒绝序列化操作. 显式声明serialVersionUID能彻底掌控序列化版本兼容性,避免因类结构微小改动或 ...
- jsonp跨站请求
本地端 url: url(r'req/',a2.req), commons.js alert(123); views.py from django.shortcuts import renderimp ...
- 鸿蒙NEXT实践(一):华为账号一键登录实现
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...
- 进程间通信-POSIX 信号量
POSIX 信号量 POSIX 信号量是一种 POSIX 标准中定义的进程间同步和互斥的方法.它允许进程之间通过信号量来实现临界区的互斥访问,从而避免竞争条件和死锁等问题. 信号量的P.V操作: P ...
- dfs优化剪枝
题目链接:D - Peaceful Teams (atcoder.jp) 先看数据范围,肯定是搜索相关 首先想到从第1个人, 第0个队开始的搜索顺序 ,因为这属于内部顺序,所以每次搜索要回溯状态,注意 ...
- Docker和K8S存在的意义
之前一直没搞明白为什么要用docker和k8s,下面简单说一下: 先说现实中需求: 1.服务器上的环境.数据,有时需要迁移 2.服务器上的资源,需要动态伸缩,比如双十一的时候搞促销,就需要扩容更多的服 ...