加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Chess (SG + 状态压缩预处理)

发布时间:2020-12-14 04:21:39 所属栏目:大数据 来源:网络整理
导读:#includebits/stdc++.h #define bit(t) (1 t) using namespace std; const int maxn = 1 21 ; const int k = 22 ; // k是集合s的大小 int sg[maxn]; // sg[n] n表示每堆数量 bool vis[ 22 ]; void get_sg(){ int maxm = 1 20 ; for ( int sta = 0 ; sta maxm
#include<bits/stdc++.h>
#define bit(t) (1 << t)
using namespace std;

const int maxn = 1<<21;
const int k = 22;//k是集合s的大小
int sg[maxn];//sg[n] n表示每堆数量
bool vis[22];

void get_sg(){
    int maxm = 1<<20;
    for(int sta = 0; sta < maxm; sta ++){
//        printf("**%d**n",sta);
        memset(vis,0,sizeof(vis));
        for(int i = 19; i >= 0; i --){
            if(sta & bit(i))
            for(int j = i - 1; j >= 0; j --){
                if(sta & bit(j))continue;
                int tmp = sta;
                tmp |= bit(j);
                tmp &= (~bit(i));
                vis[sg[tmp]] = true;
                break;
            }
        }
        for(int i = 0; i < 20; i ++)
        if(!vis[i]){
            sg[sta] = i;break;
        }

    }
}


int main()
{
    get_sg();
    int T,n,m,a,sta;scanf("%d",&T);
    while(T --){
        int goal = 0;
        scanf("%d",&n);
        while(n --){
            scanf("%d",&m);
            sta = 0;
            while(m--){
                scanf("%d",&a);
                sta |= (1 << (20 - a));
            }
            goal ^= sg[sta];
        }
        printf("%sn",goal?"YES":"NO");
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读