bzoj1228 [SDOI2009]E&D(博弈【规律)

44 篇文章 0 订阅
24 篇文章 0 订阅

题目链接

分析:
整个问题可以看做是n/2个子问题组成的
根据博弈问题的基本套路,我们要找到每一种状态的SG值异或起来
如果异或和是0,说明先手必败

所以题解都是打表找规律
那好,我把表给出来:
这里写图片描述

看的我想吐。。。

一个显然的规律:
若x和y都是奇数,那么sg=0

至于整个数据的规律,需要一点想象力
我们从左上角向右下角看,可以发现是一个逐渐递增的三角形
三角形的值也在递增

实际上SG值满足规律:

  • x为奇数,y为奇数:SG=0
  • x为偶数,y为偶数:SG=SG(x/2 , y/2)+1
  • x为奇数,y为偶数:SG=SG((x+1)/2 , y/2)+1
  • x为偶数,y为奇数:SG=SG(x/2 , (y+1)/2)+1

tip

对于这种找规律的题目,我无f*ck说
只能说多积累,多观察

#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long

using namespace std;

int n;

int sg(ll x,ll y)
{
    if ((x&1)&&(y&1)) return 0;
    else if (!(x&1)&&!(y&1)) return sg(x/2,y/2)+1;
    else if (x&1) return sg((x+1)/2,y/2)+1;
    else return sg(x/2,(y+1)/2)+1; 
}

int main()
{
    int T;
    scanf("%d",&T);
    while (T--)
    {
        int ans=0;
        scanf("%d",&n);
        ll x,y;
        for (int i=1;i<=n;i+=2)
        {
            scanf("%lld%lld",&x,&y);
            ans^=sg(x,y);
        }
        if (ans==0) printf("NO\n");
        else printf("YES\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值