Codeforces Round #685 (Div. 2) F. Nullify The Matrix 博弈

3 篇文章 0 订阅

Problem - 1451F. Nullify The Matrix

题意

有一个 n ⋅ m n\cdot m nm 的矩阵,元素均为非负数。两个人轮流对矩阵进行操作:

  • 先选一个非零点 ( r 1 , c 1 ) (r_1,c_1) (r1,c1) ,一个点 ( r 2 , c 2 ) (r_2,c_2) (r2,c2) ,满足 r 2 ≥ r 1 , c 2 ≥ c 1 r_2\ge r_1,c_2\ge c_1 r2r1,c2c1
  • a r 1 , c 1 a_{r_1,c_1} ar1,c1 的值减小为 [ 0 , a r 1 , c 1 − 1 ] [0,a_{r_1,c_1}-1] [0,ar1,c11]
  • 任选一条从开始点 ( r 1 , c 1 ) (r_1,c_1) (r1,c1) 到结束点 ( r 2 , c 2 ) (r_2,c_2) (r2,c2) 的一条最短路径,并任意修改路径上的点为一个非负数。
  • 路径上的点不包括起始点 ( r 1 , c 1 ) (r_1,c_1) (r1,c1),但包括结束点 ( r 2 , c 2 ) (r_2,c_2) (r2,c2)
  • 当矩阵的数全部为 0 0 0 时,无法进行操作,游戏结束。无法操作的一方输。

Ashish先手,谁必胜。

解法

将矩阵的 n ⋅ m n\cdot m nm 个元素进行分组,对于任意元素 a i , j a_{i,j} ai,j ,满足 i + j = d i+j=d i+j=d 的元素所在组的编号为 d d d ,即所有 i + j i+j i+j 的值相等的元素为一组。

  • 有两个状态 S 1 , S 2 S_1,S_2 S1,S2 S 1 S_1 S1 表示在同一组的元素异或和全部为 0 0 0 S 2 S_2 S2 表示存在一组元素的异或和不等于 0 0 0
  • S 1 S_1 S1 进行一步操作后必定转换为 S 2 S_2 S2
    • 因为起始点 a r 1 , c 1 a_{r_1,c_1} ar1,c1 的值必定减小,那么 r 1 + c 1 r_1+c_1 r1+c1 这一组的异或值必定会变成非 0 0 0
  • S 2 S_2 S2 进行一步操作可以转换为 S 1 S_1 S1
    • 任选一条路径,这条路径上的每个点都分别属于一组,将这个点的值修改为这组其他所有元素的异或和即可。起始点必须减少,一定在起始点所在组中存在一个数,减少后这组的异或和为 0 0 0
  • 结束状态为 S 1 S_1 S1 ,那么如果开始状态为 S 1 S_1 S1 ,先手会一直处在 S 1 S_1 S1 状态,先手必败;否则先手必胜。
解法
#pragma region
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <vector>
using namespace std;
typedef long long ll;
#define tr t[root]
#define lson t[root << 1]
#define rson t[root << 1 | 1]
#define rep(i, a, n) for (int i = a; i <= n; ++i)
#define per(i, a, n) for (int i = n; i >= a; --i)
#pragma endregion
const int maxn = 105;
int n, m, a[maxn][maxn];
int xr[maxn << 1];
int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        memset(xr, 0, sizeof(xr));
        scanf("%d%d", &n, &m);
        rep(i, 1, n) rep(j, 1, m) scanf("%d", &a[i][j]), xr[i + j] ^= a[i][j];
        int flag = 0;
        rep(i, 2, n + m) if (xr[i]) flag = 1;
        puts(flag ? "Ashish" : "Jeel");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值