hdu 5724-Chess(状态压缩+sg函数)
代码:
#include<bits/stdc++.h> using namespace std; const int N=20; int SG[1<<N]; bool S[N]; void get_SG(int n) { memset(SG,0,sizeof(SG)); for(int i=0;i<n;i++) { memset(S,false,sizeof(S)); for(int j=29;j>=0;j--) { if(i&(1<<j)) { for(int k=j-1;k>=0;k--) { if(!(i&(1<<k))) { int temp=i; temp^=(1<<j)^(1<<k); S[SG[temp]]=true; break; } } } } for(int j=0;j<N;j++) if(!S[j]) { SG[i]=j; break; } } } int main() { //ios::sync_with_stdio(false); //cin.tie(0); int t; get_SG(1<<20); scanf("%d",&t); while(t--) { int n,m,a,ans=0; scanf("%d",&n); while(n--) { scanf("%d",&m); int temp=0; while(m--) { scanf("%d",&a); temp^=(1<<(20-a)); } ans^=SG[temp]; } if(ans)cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }