BZOJ 1434: [ZJOI2009]染色游戏

 

 


 

一开始想这不$SG$裸题...然后发现100组数据...然后发现连通块是任意的求$SG$貌似要暴力枚举....

然后想了一下1维,手动打表,每次就是队当前所有异或后缀和求$mex$,好像就是$lowbit$的样子

然后2维就不会了...

看题解 什么!写个暴力打表!什么!2的幂

不管了抄结论行了.....

发现$i=1, j=1$真的需要手动打表的结果啊

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=105;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}
    return x*f;
}
int n,m,ans[N<<1];
char s[N];
int Log[N];
inline void iniLog(){
    Log[1]=0;
    for(int i=2;i<=200;i++) Log[i]=Log[i>>1]+1;
}
int main(){
    freopen("in","r",stdin);
    int T=read();
    iniLog();
    while(T--){
        m=read();n=read();
        memset(ans,0,sizeof(ans));
        for(int i=1;i<=m;i++){
            scanf("%s",s+1);
            for(int j=1;j<=n;j++) if(s[j]!='H'){
                if(i!=1 && j!=1) ans[i+j-2]^=1;
                else if(i==1) ans[ Log[ j&(-j) ] ]^=1;
                else ans[ Log[ i&(-i) ] ]^=1;
            }
        }
        int flag=0;
        for(int i=0;i<=n+m;i++) if(ans[i]) {flag=1;break;}
        if(flag) puts("-_-");
        else puts("=_=");
    }
}

 

posted @ 2017-03-13 18:46  Candy?  阅读(273)  评论(0编辑  收藏  举报