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

题目链接

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

所以题解都是打表找规律
那好,我把表给出来:
bzoj1228 [SDOI2009]E&D(博弈【规律)_第1张图片

看的我想吐。。。

一个显然的规律:
若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
#include
#include
#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;
}

你可能感兴趣的:(博弈,乱搞,省选)