洛谷2575高手过招

题目:https://www.luogu.org/problemnew/show/P2575

略微理解一下题意。

稍稍状压的SG模板。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int T,n,sg[(1<<20)+5],xnt;
void dfs(int cur)
{
    if(sg[cur]!=-1)return;
    int sum=0;
    for(int i=1;i<20;i++)
        if((1<<i)&cur)
        {
            if(((1<<(i-1))&cur)==0)
            {
                int k=cur-(1<<i)+(1<<(i-1));
                dfs(k);sum|=(1<<sg[k]);
            }
            else {
                for(int j=i-1;j>=0;j--)
                    if(((1<<j)&cur)==0)
                    {
                        int k=cur-(1<<i)+(1<<j);
                        dfs(k);sum|=(1<<sg[k]);
                        break;
                    }
            }
        }
    for(int i=0;i<20;i++)
        if(!((1<<i)&sum))
        {
            sg[cur]=i;return;
        }
}
void init()
{
    memset(sg,-1,sizeof sg);
    for(int i=0;i<20;i++)
        sg[(1<<i)-1]=0;
}
int main()
{
    init();
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);int m,sum=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&m);int nw=0,k;
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&k);k=20-k+1;
                nw|=(1<<(k-1));
            }
            dfs(nw);
            sum^=sg[nw];
        }
        if(sum)printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

 

posted on 2018-05-24 23:07  Narh  阅读(158)  评论(0编辑  收藏  举报

导航