1. 程式人生 > >洛谷2575高手過招

洛谷2575高手過招

sca 模板 amp oid n) ems targe void std

題目: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; }

洛谷2575高手過招