ARC151C 01 Game

ARC151C 01 Game

题目链接:ARC151C 01 Game

SG 函数好题。

思路

考虑把原问题分成多个区间的不同问题,求 SG 在异或起来。

设:
1.SG1(len) 长度为 len,边界没有数字。

2.SG2(len) 长度为 len,只有一个边界有数字。

3.SG3(len) 长度为 len,两个边界都有相同数字。

4.SG4(len) 长度为 len,两个边界都有不同数字。

初始有 SG1(0)=SG2(0)=SG4(0)=0,SG3(0)=1

因为 SG3(0) 不存在,所以看做先手胜。

考虑枚举选择的点 i,有:

SG1(len)=mexi=1len(SG2(i1)SG2(leni))

SG2(len)=mexi=1lenmex(SG2(i1)SG3(leni),SG2(i1)SG4(leni))

SG3(len)=mexi=1lenmex(SG3(i1)SG3(leni),SG4(i1)SG4(leni))

SG4(len)=mexi=1lenmex(SG3(i1)SG4(leni),SG4(i1)SG3(leni))

然后我们通过打表发现:

SG1(len)=lenmod2

SG2(len)=len

SG3(len)=1

SG4(len)=0

这个可以也可以通过上述方程归纳证明。

CODE

#include<bits/stdc++.h>
using namespace std;

#define ll long long

const int maxn=2e5+5;

ll n;
ll x[maxn];

int m;
int y[maxn];

int main()
{
    scanf("%lld%d",&n,&m);
    for(int i=1;i<=m;i++) scanf("%lld%d",&x[i],&y[i]);
    x[0]=0,x[m+1]=n+1;
    ll sg=0;
    for(int i=0;i<=m;i++)
    {
        ll len=x[i+1]-x[i]-1;
        if(i==0&&i==m) sg^=(len&1);
        else if(i==0||i==m) sg^=len;
        else if(y[i]==y[i+1]) sg^=1;
    }
    if(sg) printf("Takahashi");
    else printf("Aoki");
}
posted @   彬彬冰激凌  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示