luogu2594 [ZJOI2009]染色游戏
做法其他题解已经说得很清楚了,但似乎没有对于本题 SG 函数正确性的证明,我来口胡一下(
证明:
猜想:
\]
我们要用到一个结论: 局面的 SG 值等于局面中所有反面朝上的硬币单独存在时的 SG 值的异或和 。然而这个结论我不太会证()。我们暂且使用它而不证明。
首先当 \(i=1\lor j=1\) 成立时,本题相当于一维放硬币问题,其 SG 函数等同于一维的 \(lowbit(i)\)。因为 \(i\) 或 \(j\) 中至少有一个是 1,于是我们只需要将横纵坐标相加再 \(-1\) 即可消去为 1 的那一维。
对于其他情况我们使用数学归纳法:
首先对于 \(\operatorname{SG}(2,2)\) ,有以下几种选择方案(下图中 \(0/1\) 代表反转后分别是正面/反面朝上):
\(\begin{matrix} 0&0\\0&0 \end{matrix} ,\operatorname{SG}=0\)
\(\begin{matrix} 0&1\\0&0 \end{matrix} ,\operatorname{SG}=\operatorname{SG}(1,2)=2\)
\(\begin{matrix} 0&0\\1&0 \end{matrix} ,\operatorname{SG}=\operatorname{SG}(2,1)=2\)
\(\begin{matrix} 0&1\\1&0 \end{matrix} ,\operatorname{SG}=\operatorname{SG}(1,2)\space\operatorname{xor}\space \operatorname{SG}(2,1)=0\)
\(\begin{matrix} 1&1\\0&0 \end{matrix} ,\operatorname{SG}=\operatorname{SG}(1,1)\space\operatorname{xor}\space \operatorname{SG}(1,2)=3\)
\(\begin{matrix} 1&0\\1&0 \end{matrix} ,\operatorname{SG}=\operatorname{SG}(1,1)\space\operatorname{xor}\space \operatorname{SG}(2,1)=3\)
\(\begin{matrix} 1&1\\1&0 \end{matrix} ,\operatorname{SG}=\operatorname{SG}(1,1)\space\operatorname{xor}\space SG(1,2)\space\operatorname{xor}\space \operatorname{SG}(2,1)=1\)
\(\therefore \operatorname{SG}(2,2)=\operatorname{mex}\{0,2,2,0,3,3,1\}=4\),满足猜想。
还有一种特殊情况就是 \(i=2\land j>2\) 或 \(i>2\land j=2\),不难发现它们是等价的,因此这里我们只以 \(i=2\land j>2\) 为例。此时有 \(\operatorname{SG}(i,j-1)=2^{i+j-3},\operatorname{SG}(i-1,j)=\operatorname{lowbit}(j)\)。由 SG 函数定义有对于左上角为 \((1,1)\),右下角为 \((i,j-1)\) 的不包含右下角的矩形,在其中选择满足题目要求的连通块所得 SG 函数值域取遍 \([0,2^{i+j-3}-1]\)。因此在选择 \((i,j-1)\) 一点与上述矩形范围内取连通块可以取遍 \(2^{i+j-3}\space\operatorname{xor}\space[0,2^{i+j-3}-1]\) 即 \([2^{i+j-3},2^{i+j-2}-1]\) 范围内的值;可以证明在 \(j\ge3\) 时有 \(\operatorname{SG}(i-1,j)=\operatorname{lowbit}(j)\le 2^{i+j-4}\) (在 \(j=3\) 时有 \(\operatorname{lowbit}(3)=1\le 2^{i+j-4}\) ,而在 \(j>3\) 时有 \(\operatorname{lowbit}(j)\le j \le 2^{j-2}=2^{i+j-4}\)),因此在选择 \((i-1,j)\) 一点与上述矩形范围内取连通块可以取遍 \(\operatorname{lowbit}(j)\space\operatorname{xor}\space[0,2^{i+j-3}-1]\) 也即 \([0,2^{i+j-3}-1]\) 范围内的值(因为 \(\operatorname{lowbit}(j)\) 一位上为 1 的数异或后该位会变成 0,为 0 的数该位会变为 1,值域仍取遍)。做一下 mex 可得 \(\operatorname{SG}(i,j)=2^{i+j-2}\),符合猜想。
对于 \(i>2\land j>2\) 的 \((i,j)\),由数学归纳法有 \(\operatorname{SG}(i,j-1)=\operatorname{SG}(i-1,j)=2^{i+j-3}\),由 SG 函数定义有对于左上角为 \((1,1)\),右下角为 \((i,j-1)\) 的不包含右下角的矩形,在其中选择满足题目要求的连通块所得 SG 函数值域取遍 \([0,2^{i+j-3}-1]\)。因此除选择点 \((i,j)\)外,在 \((i,j-1),(i-1,j)\) 两点与上述矩形范围内取连通块可以取遍 \([0,2^{i+j-3}-1]\) 范围内的值,在 \((i,j-1)\) 一点与上述矩形范围内取连通块可以取遍 \(2^{i+j-3}\space\operatorname{xor}\space[0,2^{i+j-3}-1]\) 即 \([2^{i+j-3},2^{i+j-2}-1]\) 范围内的值,做一下 mex 可得 \(\operatorname{SG}(i,j)=2^{i+j-2}\),符合猜想。
证毕。
顺便挂一下代码:
#include <bits/stdc++.h>
using namespace std;
int T , n , m , sg[110][110] , init() , f[220] , flag;
string s;
inline void init()
{
for(int i = 1 ; i <= 100 ; i++ ) sg[i][1] = sg[1][i] = log2(i & (-i));
for(int i = 2 ; i <= 100 ; i++ )
for(int j = 2 ; j <= 100 ; j++ ) sg[i][j] = i + j - 2;
return ;
}
int main()
{
init();
scanf("%d" , &T);
while(T--)
{
memset(f , 0 , sizeof(f)); flag = 0;
scanf("%d%d" , &n , &m);
for(int i = 1 ; i <= n ; i++ )
{
cin >> s;
for(int j = 1 ; j <= m ; j++ )
{
if(s[j - 1] == 'T') f[sg[i][j]] ^= 1;
}
}
for(int i = 0 ; i <= 200 ; i++ )
{
if(f[i])
{
flag = 1;
break;
}
}
if(flag) printf("-_-\n");
else printf("=_=\n");
}
return 0;
}
/*
1
3 4
TTHH
THTH
TTHH
*/
luogu2594 [ZJOI2009]染色游戏的更多相关文章
- [luogu2594 ZJOI2009]染色游戏(博弈论)
传送门 Solution 对于硬币问题,结论是:当前局面的SG值等于所有背面朝上的单个硬币SG值的异或和 对于求单个背面朝上的硬币SG值...打表找规律吧 Code //By Menteur_Hxy ...
- 【BZOJ1434】[ZJOI2009]染色游戏(博弈论)
[BZOJ1434][ZJOI2009]染色游戏(博弈论) 题面 BZOJ 洛谷 题解 翻硬币的游戏我似乎原来在博客里面提到过,对于这类问题,当前局面的\(SG\)函数就是所有反面朝上的硬币单一存在时 ...
- [ZJOI2009]染色游戏
Description 一共n × m 个硬币,摆成n × m 的长方形.dongdong 和xixi 玩一个游戏, 每次可以选择一个连通块,并把其中的硬币全部翻转,但是需要满足存在一个 硬币属于这个 ...
- BZOJ1434:[ZJOI2009]染色游戏(博弈论)
Description 一共n×m个硬币,摆成n×m的长方形.dongdong和xixi玩一个游戏,每次可以选择一个连通块,并把其中的硬币全部翻转,但是需要满足存在一个硬币属于这个连通块并且所有其他硬 ...
- bzoj1434 [ZJOI2009]染色游戏
Description 一共n × m 个硬币,摆成n × m 的长方形.dongdong 和xixi 玩一个游戏, 每次可以选择一个连通块,并把其中的硬币全部翻转,但是需要满足存在一个 硬币属于这个 ...
- BZOJ 1434: [ZJOI2009]染色游戏
一开始想这不$SG$裸题...然后发现100组数据...然后发现连通块是任意的求$SG$貌似要暴力枚举.... 然后想了一下1维,手动打表,每次就是队当前所有异或后缀和求$mex$,好像就是$lowb ...
- BZOJ 1411&&Vijos 1544 : [ZJOI2009]硬币游戏【递推,快速幂】
1411: [ZJOI2009]硬币游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 897 Solved: 394[Submit][Status ...
- bzoj1411: [ZJOI2009]硬币游戏
1411: [ZJOI2009]硬币游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 965 Solved: 420[Submit][Status ...
- 题解 [SDOI2009]E&D/染色游戏/Moving Pebbles
E&D 染色游戏 Moving Pebbles E&D 题目大意 给出 \(2n\) 堆石子,\(2i-1\) 和 \(2i\) 为一组.每次可以选择一组删掉其中一堆,然后从同一组另外 ...
随机推荐
- GO汇编-函数
GO汇编-函数 终于到函数了!因为Go汇编语言中,可以也建议通过Go语言来定义全局变量,那么剩下的也就是函数了.只有掌握了汇编函数的基本用法,才能真正算是Go汇编语言入门.本章将简单讨论Go汇编中函数 ...
- openresty 学习笔记小结:综合应用实例
openresty 学习笔记小结:综合应用实例 这个综合实验实现的功能其实很简单,用户访问一个页面,显示一个默认页面.输入参数(post或者get都可以),如果参数在数据库查询得到并满足一定条件,根据 ...
- toFixed奇葩问题
1.浮点数运算后的精度问题 在计算商品价格加减乘除时,偶尔会出现精度问题 // 加法 ===================== 0.1 + 0.2 = 0.30000000000000004 0.7 ...
- ASML光刻机PK 原子弹,难度?
ASML光刻机PK 原子弹,难度? 一. 物理世界和网络世界的交汇点:光刻机 光刻机的技术有多高级,看看这个知乎提问,可以感受一下: 有人这样形容光刻机:这是一种集合了数学.光学.流体力学.高分子物 ...
- ThreadLocal源码阅读笔记
功能描述 ThreadLocal解决了访问共享变量的阻塞问题,并且不需要像CAS操作一样牺牲CPU资源,它为每一个线程维护了一个变量副本,每个线程在访问ThrealLocal里面的变量时实际上访问的是 ...
- NX二次开发-获取WCS标识
函数:UF_CSYS_ask_wcs() 函数说明:获取工作坐标系对象的标识. 用法: 1 #include <uf.h> 2 #include <uf_csys.h> 3 e ...
- 记一次项目中解决 -- 并发减库存超卖问题过程(Java)
起因:项目中要做预约功能,首先每天的余票都是有上限的,自然不能出现超卖的情况 基于我们项目是单体分布式的springcloud部署,我想了下 第一种方法,直接mysql加行锁,要update这条库存数 ...
- 【题解】Luogu p2285 BZOJ1207 [HNOI2004]打鼹鼠
题目描述 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的.根据这个特点阿牛编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某些时刻鼹鼠会在某一个网格探出头来透透气. ...
- vue调用子组件方法时,参数传不过去
有可能是因为子组件方法用了 async await 子组件去掉async就好了
- CosId 1.0.0 发布,通用、灵活、高性能的分布式 ID 生成器
CosId 通用.灵活.高性能的分布式 ID 生成器 介绍 CosId 旨在提供通用.灵活.高性能的分布式系统 ID 生成器. 目前提供了俩大类 ID 生成器:SnowflakeId (单机 TPS ...