zoukankan      html  css  js  c++  java
  • BZOJ3503:[CQOI2014]和谐矩阵(高斯消元,bitset)

    Description

    我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1。一个元素相邻的元素包括它本
    身,及他上下左右的4个元素(如果存在)。
    给定矩阵的行数和列数,请计算并输出一个和谐的矩阵。注意:所有元素为0的矩阵是不允许的。

    Input

    输入一行,包含两个空格分隔的整数m和n,分别表示矩阵的行数和列数。

    Output

    输出包含m行,每行n个空格分隔整数(0或1),为所求矩阵。测试数据保证有解。

    Sample Input

    4 4

    Sample Output

    0 1 0 0
    1 1 1 0
    0 0 0 1
    1 1 0 1

    数据范围
    1 <=m, n <=40

    Solution

    咋感觉我写了三个高斯消元的题三个板子都长得不一样
    讲真这个题不知道比1770那个题低到哪里去了(其实差不多)
    会做那个题一定会做这个【认真脸
    很明显这个还是构造01矩阵然后解异或方程组
    只不过这个构造出来的矩阵是n*m的,n^3显然很吃力
    那么我们把1770代码里的异或用bitset来搞常数就小很多了
    听说bitset随便虐1e9?

    Code

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<bitset>
     5 #define N (1600+100)
     6 #define id(x,y) (x-1)*m+y
     7 using namespace std;
     8 
     9 bitset<N>f[N];
    10 int ans[N],n,m;
    11 int dx[7]={0,1,-1,0,0,0},dy[6]={0,0,0,1,-1,0};
    12 
    13 void Gauss(int n)
    14 {
    15     for (int i=1; i<=n; ++i)
    16     {
    17         int num=i;
    18         for (int j=i+1; j<=n; ++j)
    19             if (f[j][i]>f[num][i]) num=j;
    20         if (num!=i) swap(f[i],f[num]);
    21         
    22         for (int j=i+1; j<=n; ++j)
    23             if (f[j][i]) f[j]^=f[i];//这里用bitset来搞常数好像很小 
    24     }
    25     for (int i=n; i>=1; --i)
    26     {
    27         if (!f[i][i]) ans[i]=1;
    28         else
    29         {
    30             for (int j=i+1; j<=n; ++j)
    31                 f[i][n+1]=f[i][n+1]^(f[i][j]*ans[j]);
    32             ans[i]=f[i][n+1];
    33         }
    34     }
    35 }
    36 
    37 int main()
    38 {
    39     scanf("%d%d",&n,&m);
    40     for (int i=1; i<=n; ++i)
    41         for (int j=1; j<=m; ++j)
    42             for (int k=1; k<=5; ++k)
    43             {
    44                 int x=i+dx[k],y=j+dy[k];
    45                 if (x>0 && x<=n && y>0 && y<=m)
    46                     f[id(i,j)][id(x,y)]=1;
    47             }
    48     Gauss(n*m);
    49     for (int i=1; i<=n; ++i)
    50     {
    51         for (int j=1; j<=m-1; ++j)
    52             printf("%d ",ans[id(i,j)]);
    53         printf("%d
    ",ans[id(i,m)]);
    54     }
    55 }
  • 相关阅读:
    wikioi 1002 旁路
    OS X升级到10.10使用后pod故障解决方案出现
    Python challenge 3
    maven 编
    独立博客网站FansUnion.cn操作2多年的经验和教训以及未来计划
    Wakelock API详解
    智遥工作流——会签与多人审批区别
    mysql 参数optimizer_switch
    OpenRisc-31-关于在设计具有DMA功能的ipcore时的虚实地址转换问题的分析与解决
    TROUBLE SHOOTING: FRM-30425
  • 原文地址:https://www.cnblogs.com/refun/p/8953107.html
Copyright © 2011-2022 走看看