题目: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 "); else printf("NO "); } return 0; }