题目链接

前言

发现自己三岁时的题目都不会做。

我发现我真的是菜得真实。

正文

神仙构造,分讨题。

不敢说有构造,但是分讨我只服这道题。

看上去像是一个类似 \(Nim\) 游戏的变种,经过不断猜测结论无果后果断弃疗。

(然后我就出门右转直接进了题解区),在这里记录一下自己的理解。

设 \(l_{i,j}\) 表示在 \(i\sim j\) 这个区间左边再加一堆 \(l_{i,j}\) 的石子时,先手必败。

同理,设 \(r_{i,j}\) 表示在 \(i\sim j\) 这个区间右边再加一堆 \(r_{i,j}\) 的石子时,先手必败。

(以下的所有证明以及验证我们都以 \(l_{i,j}\) 为准,\(r_{i,j}\) 情况相同)。

等等,如果上述满足条件的石子个数不唯一,怎么办?

好像不太好搞欸,是不是要再开一维数组?

既然不唯一的情况这么困难,为什么不想想会不会存在这种情况呢?

证明:

我们假设 \(l_{i,j}\) 存在两种可能 \(a\) 和 \(b\) ,且我们钦定 \(a < b\)。

既然 \(a\) 和 \(b\) 都满足要求,所以此时都是必败态。

但是很显然,我们可以让先手对于 \(b\) 的情况一直取直到 \(a\) 。

此时先手让后手到了一个必败态所以先手必败。??(对,这就是不唯一时的推理)

所以可以得出,\(l_{i,j}\) 一定是唯一的。

那万一 \(l_{i,j}\) 不存在怎么办?

等一等,\(l_{i,j}\) 是不是一定存在呢?

在这里我口胡一下:

因为对于所有的 \([i,j]\) 区间都不存在 \(l_{i,j}\) ,则对于所有从左边拿的一定是必胜态。

但是如果只有一堆石子 \(a\) 的话:此时可以发现 \(l_{i,j} = a\) 因为此时先手怎么取后手也学者他。

这样的话后手会取完最后一个石子。

所以,\(l_{i,j}\) 一定是存在的的。


现在来进行刺激的分讨过程。

我在这里会对每一种可能的结果进行简要的说明。

  • 首先我们先来考虑边界的情况:

    就和我之前说的一样 \(l_{i,i} = a_i\) , \(r_{i,i}\) 同理。

为了方便起见,我们令 \(x=a_j\) , \(L =l_{i,j-1}\) , \(R=r_{i,j-1}\) 。

  • ( \(x < L\) 且 \(x <R\) ) 或者 ( \(x > L\) 且 \(x >R\) )

    \(l_{i,j} = x\) 。

此时我们可以运用类似之前的方法,先手取什么,后手就取什么。

那么最后的结果就是先手先取完了左右两端石子中的一堆。

然后后手可以随便取另一边的一堆,使得此堆的数量变成 \(l_{i,j}\) 或 \(r_{i,j}\) 。

  • \(R<x<L\)

    \(L_{i,j} = x-1\)

假设先手先拿了左边这一堆。

那么假设还剩下了 \(x\) 个石子,如果 \(x<R\),后手把右侧的那一堆也给拿成 \(x\) 就成了( \(x < L\) 且 \(x <R\) )这种情况。

如果 \(x\geq R\),那么后手把最后那一堆拿成 \(x+1\),于是又回到了我们讨论的这种情况。

同理,我们也可以推出右边先取玩的的情况。

  • \(L<x<R\)

    \(L_{i,j} = x+1\)

    和上一种基本上是一摸一样,在这里就不讲了。

Code

#include <bits/stdc++.h>

#define file(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout)

#define Enter puchar('\n')
#define quad putchar(' ') const int N = 1005; int T, a[N], l[N][N], r[N][N]; signed main(void) {
// file("P2599");
std::cin >> T;
for (int test = 1, n; test <= T; test++) {
std::cin >> n;
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= n; i++)
l[i][i] = r[i][i] = a[i];
for (int len = 1; len <= n; len ++) {
for (int i = 1; i + len - 1 <= n; i++) {
int j = i + len - 1;
int L, R, x;
x = a[j];
L = l[i][j - 1]; R = r[i][j - 1];
if (R == x) l[i][j] = 0;
else if (x < L && x < R) l[i][j] = x;
else if (x > L && x > R) l[i][j] = x;
else if (R < x && x < L) l[i][j] = x - 1;
else l[i][j] = x + 1;
x = a[i];
L = l[i + 1][j]; R = r[i + 1][j];
if (L == x) r[i][j] = 0;
else if (x < L && x < R) r[i][j] = x;
else if (x > L && x > R) r[i][j] = x;
else if (R < x && x < L) r[i][j] = x + 1;
else r[i][j] = x - 1;
}
}
if (l[2][n] == a[1]) std::cout << "0" << std::endl;
else std::cout << "1" << std::endl;
}
}

P2599 [ZJOI2009]取石子游戏 做题感想的更多相关文章

  1. 【BZOJ1413】[ZJOI2009]取石子游戏(博弈论,动态规划)

    [BZOJ1413][ZJOI2009]取石子游戏(博弈论,动态规划) 题面 BZOJ 洛谷 题解 神仙题.jpg.\(ZJOI\)是真的神仙. 发现\(SG\)函数等东西完全找不到规律,无奈只能翻题 ...

  2. bzoj 1413 [ZJOI2009]取石子游戏

    1413: [ZJOI2009]取石子游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 747  Solved: 490[Submit][Statu ...

  3. 【一本通提高博弈论】[ZJOI2009]取石子游戏

    [ZJOI2009]取石子游戏 题目描述 在研究过 Nim 游戏及各种变种之后,Orez 又发现了一种全新的取石子游戏,这个游戏是这样的: 有 n n n 堆石子,将这 n n n 堆石子摆成一排.游 ...

  4. 【刷题】BZOJ 1413 [ZJOI2009]取石子游戏

    Description 在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的: 有n堆石子,将这n堆石子摆成一排.游戏由两个人进行,两人轮流操作,每次操作者都可以从 ...

  5. vijos 1557:bzoj:1413: [ZJOI2009]取石子游戏

    Description 在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的: 有n堆石子,将这n堆石子摆成一排.游戏由两个人进行,两人轮流操作,每次操作者都可以从 ...

  6. bzoj1413 [ZJOI2009]取石子游戏

    Description 在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的: 有n堆石子,将这n堆石子摆成一排.游戏由两个人进行,两人轮流操作,每次操作者都可以从 ...

  7. 洛谷P2599||bzoj1413 [ZJOI2009]取石子游戏

    bzoj1413 洛谷P2599 根本不会啊... 看题解吧 #include<cstdio> #include<algorithm> #include<cstring& ...

  8. [ZJOI2009]取石子游戏

    瞪了题解两三天,直接下转第二篇题解就康懂了 首先我们令 : \(L[i][j]\) 表示当前 \([i,j]\) 区间左侧放置 \(L[i,j]\) 数量的石子后先手必败 \(R[i][j]\) 表示 ...

  9. Games:取石子游戏(POJ 1067)

    取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 37662   Accepted: 12594 Descripti ...

随机推荐

  1. 攻防世界-MISC:can_has_stdio?

    这是攻防世界MISC高手进阶区的题目,题目如下: 点击下载附件一,解压后得到一个txt文件,打开后内容如下: 根据百度搜索的结果可知这是一种叫做BrainFuck的语言,BrainFuck是由Urba ...

  2. Azure Service Fabric 踩坑日志

    近期项目上面用到了Azure Service Fabric这个服务,它是用来做微服务架构的,由于这套代码和架构都是以前同学留下来的,缺少文档,项目组在折腾时也曾遇到几个问题,这里整理如下,以供参考. ...

  3. 踩到一个关于分布式锁的非比寻常的BUG!

    你好呀,我是歪歪. 提到分布式锁,大家一般都会想到 Redis. 想到 Redis,一部分同学会说到 Redisson. 那么说到 Redisson,就不得不掰扯掰扯一下它的"看门狗&quo ...

  4. .NET混合开发解决方案13 自定义WebView2中的上下文菜单

    系列目录     [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...

  5. .NET混合开发解决方案15 WebView2控件集成到WinForm程序编译后的文件及结构说明

    系列目录     [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...

  6. 理解 Angular 服务

    理解 Angular 服务 本文写于 2021 年 3 月 29 日 理解 Angular 服务 什么是服务 服务写法 原理简述 提供服务 1. 在服务中注册 2. 在 module 中注册 3. 在 ...

  7. docker 安装和错误解决方案

    安装 x64 架构 install docker switch mirror docker desktop docker run -d -p 80:80 docker/getting-started ...

  8. 205. Isomorphic Strings - LeetCode

    Question 205. Isomorphic Strings Solution 题目大意:判断两个字符串是否具有相同的结构 思路:构造一个map,存储每个字符的差,遍历字符串,判断两个两个字符串中 ...

  9. SylixOS——虚拟机网络配置

    网络配置 点击设置按钮 新建虚拟网络适配器 输入IP地址(注意:IP地址必须和SylixOS在同一个子网内) 点击确定等待,虚拟网络适配器建立完成后效果如下(多了一个名为"以太网2" ...

  10. C#实现登录功能(连接SQLServer数据库)

    本例使用C#实现一个简单的登录功能,分为用户和管理员两个角色登录. 效果图: 核心代码 login.cs private void button1_Click(object sender, Event ...