1. 程式人生 > >bzoj 1188: [HNOI2007]分裂遊戲

bzoj 1188: [HNOI2007]分裂遊戲

set sin accepted ring span cep color string 一場

SG定理

/**************************************************************
    Problem: 1188
    User: lxy8584099
    Language: C++
    Result: Accepted
    Time:40 ms
    Memory:900 kb
****************************************************************/
 
/*
    每個豆子都是單獨的一場遊戲
    因為存在效仿性 即兩人可以走相同的方案 a[i]=a[i]&1
    然後就是SG定理異或起來 
*/ #include<cstdio> #include<cstring> using namespace std; const int N=100,M=1e4+50; int T,n,a[N],SG[M],vis[M]; int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); SG[n]=0;// 最後一個點必輸
for(int i=n-1;i>=1;i--) { memset(vis,0,sizeof(vis)); for(int j=i+1;j<=n;j++) for(int k=j;k<=n;k++) vis[SG[j]^SG[k]]=1; for(int j=0;;j++) if(!vis[j]) {SG[i]=j;break;} } int ans=0; for(int i=1;i<=n;i++) if
(a[i]&1) ans^=SG[i]; if(ans==0) puts("-1 -1 -1"),puts("0"); else { int tot=0; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) for(int k=j;k<=n;k++) if((ans^SG[i]^SG[j]^SG[k])==0) { if(++tot==1) printf("%d %d %d\n",i-1,j-1,k-1); } printf("%d\n",tot); } } return 0; }

bzoj 1188: [HNOI2007]分裂遊戲