• bzoj4171 or 省队集训day3 chess: Rhl的游戏


    【题目描述】

    RHL最近迷上一个小游戏:Flip it。游戏的规则很简单,在一个N*M的格子上,有一些格子是黑色,有一些是白色。每选择一个格子按一次,格子以及周围边相邻的格子都会翻转颜色(边相邻指至少与该格子有一条公共边的格子),黑变白,白变黑。

    RHL希望把所有格子都变成白色的。不幸的是,有一些格子坏掉了,无法被按下。这时,它可以完成游戏吗?

     

    【输入格式】

    第一行一个整数T,表示T组数据。

    每组数据开始于三个整数n,m,k,分别表示格子的高度和宽度、坏掉格子的个数。接下来的n行,每行一个长度m的字符串,表示格子状态为’B’‘W’。最后k行,每行两个整数Xi,Yi(1≤Xi≤n,1≤Yi≤m),表示坏掉的格子。

    【输出格式】

    对于每组数据,先输出一行Case #i: (1≤i≤T)

    如果可以成功,输出YES,否则输出NO

    【样例输入】

    2

    3 3 0

    WBW

    BBB

    WBW

    3 3 2

    WBW

    BBB

    WBW

    2 2

    3 2

    【样例输出】

    Case #1:

    YES

    Case #2:

    NO

    【数据范围】

    30%,n,m,k<=10

    100%,n,m,k<=256,T<=10

     

    http://www.cnblogs.com/chenyushuo/p/4685182.html

    和这个类似的设个xor方程组,对于不能按的方块,直接将它定为0即可

     

    code:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<algorithm>
     6 #define maxn 260
     7 using namespace std;
     8 char ch,s[maxn];
     9 int T,n,m,N,M,k,x,y;
    10 unsigned int c[maxn][maxn][maxn>>5],a[maxn<<1][maxn>>5];
    11 bool col[maxn][maxn],ok,d[maxn][maxn],b[maxn<<1];
    12 inline void read(int &x){
    13     for (ok=0,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=1;
    14     for (x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());
    15     if (ok) x=-x;
    16 }
    17 bool gauss(){
    18     int i,j,k,p,q;
    19     for (i=0,k=1;i<N;i++){
    20         for (p=(1<<(i&31)),j=k;j<=M&&!(a[j][i>>5]&p);j++);
    21         if (j<=M){
    22             for (q=(i>>5);q<=((N-1)>>5);q++) swap(a[k][q],a[j][q]);
    23             swap(b[k],b[j]);
    24             for (j=j+1;j<=M;j++)
    25                 if (a[j][i>>5]&p){
    26                     for (q=(i>>5);q<=((N-1)>>5);q++) a[j][q]^=a[k][q];
    27                     b[j]^=b[k];
    28                 }
    29             k++;
    30         }
    31     }
    32     for (;k<=M;k++) if (b[k]) return false;
    33     return true;
    34 }
    35 int main(){
    36     read(T);
    37     for (int t=1;t<=T;t++){
    38         read(m),read(n),read(k),N=n,M=n;
    39         for (int i=1;i<=m;i++){
    40             scanf("%s",s+1);
    41             for (int j=1;j<=n;j++) col[i][j]=(s[j]=='B');
    42         }
    43         for (int i=1;i<=n;i++) c[1][i][(i-1)>>5]=(1<<((i-1)&31));
    44         for (int i=2;i<=m;i++)
    45             for (int j=1;j<=n;j++){
    46                 for (int k=0;k<=((n-1)>>5);k++)
    47                     c[i][j][k]=c[i-1][j-1][k]^c[i-1][j][k]^c[i-1][j+1][k]^c[i-2][j][k];
    48                 d[i][j]=d[i-1][j-1]^d[i-1][j]^d[i-1][j+1]^d[i-2][j]^col[i-1][j];
    49             }
    50         for (int i=1;i<=n;i++){
    51             for (int j=0;j<=((n-1)>>5);j++)
    52                 a[i][j]=c[m][i][j]^c[m][i-1][j]^c[m][i+1][j]^c[m-1][i][j];
    53             b[i]=col[m][i]^d[m][i-1]^d[m][i]^d[m][i+1]^d[m-1][i];
    54         }
    55         while (k--){
    56             read(x),read(y),++M;
    57             for (int i=0;i<=((n-1)>>5);i++) a[M][i]=c[x][y][i];
    58             b[M]=d[x][y];
    59         }
    60         printf("Case #%d:
    ",t);
    61         if (gauss()) puts("YES");
    62         else puts("NO");
    63     }
    64     return 0;
    65 }
  • 相关阅读:
    越大优先级越高,优先级越高被OS选中的可能性就越大
    锁标记如果过多,就会出现线程等待其他线程释放锁标记
    使用带缓冲区的输入输出流的速度会大幅提高
    Bufferread有readline()使得字符输入更加方便
    java的开发主要以http为基础
    UDP也需要现有Server端,然后再有Client端
    端口是一种抽象的软件结构,与协议相关
    具有全球唯一性,相对于internet,IP为逻辑地址
    判断是否一个属性或对象可序列化
    把对象通过流序列化到某一个持久性介质称为对象的可持久化
  • 原文地址:https://www.cnblogs.com/chenyushuo/p/4687597.html
Copyright © 2020-2023  润新知