题目链接

前言

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

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

正文

神仙构造,分讨题。

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

看上去像是一个类似 \(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. Vue 生产环境(production) 打开 调试工具的方法

    总所周知,在production生产环境下,点击vue插件会显示, 并且按F12是没办法使用调试工具的,这样非常不方便 其实是有一个办法的,那就是复制下面的js,然后在控制台执行 代码中已经写清楚执行 ...

  2. 深入理解vue 修饰符sync【 vue sync修饰符示例】

    在说vue 修饰符sync前,我们先看下官方文档:vue .sync 修饰符,里面说vue .sync 修饰符以前存在于vue1.0版本里,但是在在 2.0 中移除了 .sync .但是在 2.0 发 ...

  3. 「Python实用秘技07」pandas中鲜为人知的隐藏排序技巧

    本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第7期 ...

  4. Vite2+Vue3+ts的eslint设置踩坑

    目录 新项目了 Vite搭建 eslint 先安装eslint 创建.eslintrc.js 引入规则 Airbnb 配合prettier 对ts的支持 .eslintrc.js 在页面上查看esli ...

  5. Linux(ubuntu)二进制安装mysql8.0

    mysql官方网站下载地址:https://dev.mysql.com/downloads/mysql/ 1.创建mysql运行用户和组 groupadd -g 1001 mysql useradd ...

  6. 团队Beta2

    队名:观光队 链接 组长博客 作业博客 组员实践情况 王耀鑫 **过去两天完成了哪些任务 ** 文字/口头描述 学习 展示GitHub当日代码/文档签入记录 接下来的计划 完成短租车,页面美化 **还 ...

  7. Vulnhub-DC-4靶机实战

    前言 靶机下载地址:https://www.vulnhub.com/entry/dc-4,313/ KALI地址:192.168.75.108 靶机地址:192.168.75.207 一.信息发现 1 ...

  8. 流量录制回放工具jvm-sandbox-repeater入门篇——录制和回放

    在上一篇文章中,把repeater服务部署介绍清楚了,详细可见:流量录制回放工具jvm-sandbox-repeater入门篇--服务部署 今天在基于上篇内容基础上,再来分享下流量录制和回放的相关内容 ...

  9. 中间件漏洞之IIS

    IIS中间件漏洞 我们常见的中间件有IIS.Apache.Nginx,其中IIS中间件有什么漏洞呢? IIS 短文件名漏洞: 漏洞产生的原因是为了兼容MS-DOS程序,windows为文件名较长的文件 ...

  10. AQS源码探究之竞争锁资源

    AQS源码探究---竞争锁资源 我们进入ReentrantLock源码中查看其内部类 Sync 对AQS进行扩展公共方法并定义抽象方法的抽象类 FaireSync 实现公平锁的AQS的实现类 UnFa ...