题解:CF1906G Grid Game 2
题解:CF1906G Grid Game 2
题目描述
Alice 和 Bob 在一个大小为 \(10^9×10^9\) 的网格图上博弈。
其中上面有 \(n\) 个黑点,分别为 \((x_i,y_i)\),其余的点都是白点。
一次操作为选择一个黑点,设其坐标为 \((r,c)\),设 \(t=\min(r,c)\) 则翻转所有 \(r−t+1≤x≤r,c−t+1≤y≤c\) 的点。
现在 Alice 先手进行操作,若一人无法操作则他输了,给定初始局面,问是否先手必胜。
\(1≤n≤2×10^5\)。
题解
在所有黑点上放一枚硬币,如果有两枚硬币就抵消掉(两边可以复制决策),这样翻转操作就变成了放硬币操作,写成 SG 函数,也就是说,放在 \((x, y)\) 上的硬币的 SG 函数为:
MEX 的集合只有一个数,要么是 0 要么是 1,所以所有的 \(f(x, y)\) 都 \(\in\{0,1\}\)。写成这样的形式:对于 \((x, y)\),令 \(t=\min(x, y)\) 则
到这里可以开始正攻,然后失败,可以发现我们总是想尽可能的将一行 / 一列压缩成 \(O(1)\) 个位置方便计算,但是最后压缩出的位置很丑,而且无法确定的初值会很多,还是会比较难。
到这里不得已去抄了题解,题解做法是,既然发现需要压缩这些位置,那么就尝试去把前缀和造出来,造到最后我们直接设二维前缀和 \(g(x,y)\),如果 \(x>y\),那么它很自然地就会满足 \(g(x, y)=g(x,y-x)\oplus 1\),这个 \(1\) 就是刚才 \(f\) 的定义推得的。那么这个 \(g\) 自然就能辗转相除。从 \(g\) 还原 \(f\) 也是直接 \(g(x,y)\oplus g(x,y-1)\oplus g(x-1,y)\oplus g(x-1,y-1)=f(x,y)\) 就好了。时间复杂度 \(O(n\log V)\)。
代码
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#define debug(...) fprintf(stderr, ##__VA_ARGS__)
#else
#define endl "\n"
#define debug(...) void(0)
#endif
using LL = long long;
int g(int x, int y) {
if (!x) return 1;
return g(y % x, x) ^ (y / x);
}
int main() {
#ifndef LOCAL
cin.tie(nullptr)->sync_with_stdio(false);
#endif
int n, ans = 0;
cin >> n;
while (n--) {
int x, y;
cin >> x >> y;
ans ^= g(x, y) ^ g(x - 1, y) ^ g(x, y - 1) ^ g(x - 1, y - 1);
}
cout << (ans & 1 ? "FIRST" : "SECOND") << endl;
return 0;
}
表
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1
1 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 1 1
1 1 0 0 0 1 1 1 1 0 1 0 0 1 0 0 1 0 1 1
1 0 1 0 1 0 1 1 0 1 0 0 0 0 1 0 0 1 1 1
1 1 1 1 1 1 0 0 1 1 1 1 0 1 0 1 1 1 0 1
1 0 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 1 1
1 1 0 0 1 0 1 0 0 1 0 0 0 1 1 0 1 0 0 0
1 0 0 1 0 1 1 0 1 0 1 0 0 0 1 1 1 1 0 0
1 1 0 0 1 0 1 1 0 1 0 0 1 1 0 1 0 0 1 0
1 0 1 1 0 0 1 1 0 0 0 0 0 1 0 0 1 1 0 0
1 1 1 1 0 0 0 1 0 0 1 0 0 1 1 0 1 1 0 1
1 0 1 0 1 0 1 1 1 0 1 1 1 0 1 0 0 1 0 0
1 1 0 0 0 1 0 1 1 1 0 0 1 1 0 0 0 0 0 0
1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0
1 1 0 0 1 0 1 0 1 1 0 1 1 0 0 0 0 1 1 0
1 0 1 0 0 1 1 0 0 1 0 1 1 1 0 0 1 0 1 1
1 1 1 1 1 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0
1 0 1 1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0
本文来自博客园,作者:caijianhong,转载请注明原文链接:https://www.cnblogs.com/caijianhong/p/18897354/solution-cf1906g
浙公网安备 33010602011771号