ARC151C 01 Game
前言
赛时机房大佬们以及标算都用 SG 函数做的,而我用的是最朴素的大力分类讨论,wa 了十二发才过,写下这篇题解记录我的想法,纪念一下这场比赛。
题目简意
题解
先考虑相邻两个已染色格子中间的未染色非空连续段,考虑只有一段的时候的胜负情况。手动模拟小数据可以发现,当两边颜色一样时,双方一共一定只会操作奇数次;而两边颜色不一样时,双方一共只会操作偶数次。考虑归纳地证明这个结论:设
有了这个结论,中间的那些未染色连续段的贡献相当于是交换先后手,所以现在只需要考虑
当
当
当
当
当
代码
#include <bits/stdc++.h>
#define re(i, x, y) for (int i = (x); i < (y); ++i)
#define rep(i, x, y) for (int i = (x); i <= (y); ++i)
#define repp(i, x, y, d) for (int i = (x); i <= (y); i += (d))
#define reep(i, x, y) for (int i = (x); i <= (y); i <<= 1)
#define pe(i, x, y) for (int i = (x) - 1; i >= (y); --i)
#define per(i, x, y) for (int i = (x); i >= (y); --i)
#define rep_e(i, u) for (int i = head[(u)]; i; i = e[i].nxt)
#define vi vector<int>
#define vL vector<LL>
#define vii vector<pii>
#define viL vector<piL>
#define vLi vector<pLi>
#define vLL vector<pLL>
#define eb emplace_back
#define pb pop_back
#define mp make_pair
#define pii pair<int, int>
#define piL pair<int, LL>
#define pLi pair<LL, int>
#define pLL pair<LL, LL>
#define lowbit(x) ((x) & (-(x)))
#define fi first
#define se second
#define all(x) x.begin(), x.end()
#define debug(x) cout << #x << " = " << x << endl
using namespace std;
typedef unsigned int ui;
typedef long long LL;
typedef unsigned long long ULL;
typedef double db;
#define getchar() (SB == TB && (TB = (SB = BB) + fread(BB, 1, 1 << 16, stdin), SB == TB) ? EOF : *SB++)
char BB[1 << 16], *SB = BB, *TB = BB;
template<typename T> void read(T &n) {
T w = 1;
n = 0;
char ch = getchar();
for ( ; !isdigit(ch); ch = getchar()) {
if (ch == '-') {
w = -1;
}
}
for ( ; isdigit(ch); ch = getchar()) {
n = n * 10 + (ch & 15);
}
n *= w;
}
template<typename T> void chkmn(T &a, const T &b) {
a = a > b ? b : a;
}
template<typename T> void chkmx(T &a, const T &b) {
a = a < b ? b : a;
}
int MOD;
int adt(const LL &a) {
return (a % MOD + MOD) % MOD;
}
int inc(const int &a, const int &b) {
return a + b >= MOD ? a + b - MOD : a + b;
}
int dec(const int &a, const int &b) {
return a - b < 0 ? a - b + MOD : a - b;
}
int mul(const int &a, const int &b) {
return 1LL * a * b % MOD;
}
int sqr(const int &a) {
return 1LL * a * a % MOD;
}
void Adt(LL &a) {
a = (a % MOD + MOD) % MOD;
}
void Inc(int &a, const int &b) {
a = a + b >= MOD ? a + b - MOD : a + b;
}
void Dec(int &a, const int &b) {
a = a - b < 0 ? a - b + MOD : a - b;
}
void Mul(int &a, const int &b) {
a = 1LL * a * b % MOD;
}
void Sqr(int &a) {
a = 1LL * a * a % MOD;
}
int fsp(int a, int x = MOD - 2) {
int res = 1;
for ( ; x; x >>= 1, Sqr(a)) {
if (x & 1) {
Mul(res, a);
}
}
return res;
}
const int maxn = 2e5 + 5;
LL n, m;
LL x[maxn], y[maxn];
int main() {
#ifdef sword
freopen("test.in", "r", stdin);
#endif
read(n), read(m);
if (!m) {
puts(n & 1 ? "Takahashi" : "Aoki");
return 0;
}
rep(i, 1, m) {
read(x[i]), read(y[i]);
}
bool fl = 0;
re(i, 1, m) {
if (y[i + 1] == y[i]) {
fl ^= 1;
}
}
if (x[1] == 2) {
fl ^= 1;
}
if (x[m] == n - 1) {
fl ^= 1;
}
int t = (x[1] > 2) + (x[m] < n - 1);
if (t == 1) {
puts("Takahashi");
}
else if (t == 2) {
if (x[1] == n - x[m] + 1) {
puts(fl ? "Takahashi" : "Aoki");
}
else {
if (abs(x[1] - (n - x[m] + 1)) > 1) {
puts("Takahashi");
}
else {
if (!fl) {
puts("Takahashi");
}
else {
puts(((x[1] - 1) / 2 + (n - x[m]) / 2) & 1 ? "Takahashi" : "Aoki");
}
}
}
}
else {
puts(fl ? "Takahashi" : "Aoki");
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】