CodeForces - 1451F Nullify The Matrix(尼姆博奕变形)

2023-10-17 06:50

本文主要是介绍CodeForces - 1451F Nullify The Matrix(尼姆博奕变形),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:点击查看

题目大意:给出一个 n * m 的矩阵 a,两个人在矩阵上玩游戏,每轮的操作规则如下:

  1. 选择任意一个点 ( x1 , y1 ) 作为起点,需要满足 maze[ x1 ][ y1 ] != 0
  2. 选择任意一个点 ( x2 , y2 ) 作为终点,需要满足 x1 <= x2 && y1 <= y2
  3. 点 ( x1 , y1 ) 减少一个任意值 x ∈ [ 1 , maze[ x1 ][ x2 ] ]
  4. 除起点外,起点到终点的任意一条路径上可以任意赋值

无法操作者记为失败,问先手必胜还是后手必胜

题目分析:条件非常多,不过其本质是操作 3 的减少任意值,这个可以理解为尼姆博弈中的取石子操作,所以考虑一种特殊情况,如果当且仅当任意一个副对角线上有数字时,其余位置全部为 0 时,此时就变成了一个尼姆博弈的情况了:

如上图所示,因为此时起点和终点只能选择同一个点,所以上述的四种操作简化成了只有操作 3,也就变成了一个中规中矩的尼姆博弈了

所以整张图可以斜着划分成 n + m 个尼姆游戏,只不这些尼姆游戏并不是相互独立的,而是互相影响的,接下来考虑两种局面:

  1. 局面 S:所有的尼姆游戏的异或和都是 0
  2. 局面 S':存在着一个尼姆游戏的异或和不为 0

然后就是两个需要证明的结论:

  1. 局面 S 在通过一次操作后只能变成局面 S'
  2. 局面 S' 在通过一次操作后可以变成 S,也可以变成 S'

又因为 S' 是必败局面,所以如果只看初始局面的话,初始局面若是 S' ,那么先手可以控制局势,所以先手必胜,否则先手必败

简单证明一下上面的两个结论:

  1. 因为此时的局面中,所有尼姆游戏的异或和均为 0,假设起点为 ( x , y ),因为操作 3 约束了点 ( x , y ) 一定需要被取走石子,所以显然 x + y 这个尼姆游戏的异或和一定不可能是 0 了
  2. 因为此时的局面中,至少有一个尼姆游戏的异或和不为 0,所以我们选择 x + y 最小的,且异或和不为 0 的尼姆游戏中寻找起点,以点 ( n , m ) 这个点作为终点,利用操作 3 将 x + y 这个尼姆游戏的异或和控制为 0,然后利用操作 4 将其余异或和不为 0 的位置都控制为 0 即可,因为起点到终点的一条路径上一定覆盖了 x + y ~ n + m 的所有尼姆游戏

代码:
 

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=110;int _xor[N<<1];int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--){memset(_xor,0,sizeof(_xor));int n,m;scanf("%d%d",&n,&m);for(int i=0;i<n;i++)for(int j=0;j<m;j++){int num;scanf("%d",&num);_xor[i+j]^=num;}if(*max_element(_xor,_xor+n+m)==0)puts("Jeel");elseputs("Ashish");}return 0;
}

 

这篇关于CodeForces - 1451F Nullify The Matrix(尼姆博奕变形)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/223659

相关文章

csu(背包的变形题)

题目链接 这是一道背包的变形题目。好题呀 题意:给n个怪物,m个人,每个人的魔法消耗和魔法伤害不同,求打死所有怪物所需的魔法 #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>//#include<u>#include<map

hdu3389(阶梯博弈变形)

题意:有n个盒子,编号1----n,每个盒子内有一些小球(可以为空),选择一个盒子A,将A中的若干个球移到B中,满足条件B  < A;(A+B)%2=1;(A+B)%3=0 这是阶梯博弈的变形。 先介绍下阶梯博弈: 在一个阶梯有若干层,每层上放着一些小球,两名选手轮流选择一层上的若干(不能为0)小球从上往下移动,最后一次移动的胜出(最终状态小球都在地面上) 如上图所示,小球数目依次为

poj1067(威佐夫博奕)

题意:给两堆石头,两种操作,1、在任意一堆中去任意个石头;2、在两堆中去相同多个石头 必败状态为(0,0)(1,2)(3,5)(4,7)(6,10 )  ( 8 ,13 ) (9,15)、(11,18)、(12,20)。。。。。 然后请参照http://blog.csdn.net/u013509299/article/details/37954679 代码如下: #include<io

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

Codeforces 482B 线段树

求是否存在这样的n个数; m次操作,每次操作就是三个数 l ,r,val          a[l] & a[l+1] &......&a[r] = val 就是区间l---r上的与的值为val 。 也就是意味着区间[L , R] 每个数要执行 | val 操作  最后判断  a[l] & a[l+1] &......&a[r] 是否= val import ja

[论文笔记]LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale

引言 今天带来第一篇量化论文LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale笔记。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 大语言模型已被广泛采用,但推理时需要大量的GPU内存。我们开发了一种Int8矩阵乘法的过程,用于Transformer中的前馈和注意力投影层,这可以将推理所需

Codeforces Round 971 (Div. 4) (A~G1)

A、B题太简单,不做解释 C 对于 x y 两个方向,每一个方向至少需要 x / k 向上取整的步数,取最大值。 由于 x 方向先移动,假如 x 方向需要的步数多于 y 方向的步数,那么最后 y 方向的那一步就不需要了,答案减 1 代码 #include <iostream>#include <algorithm>#include <vector>#include <string>