zoukankan      html  css  js  c++  java
  • BZOJ 3503: [Cqoi2014]和谐矩阵( 高斯消元 )

    偶数个相邻, 以n*m个点为变量, 建立异或方程组然后高斯消元...

    O((n*m)^3)复杂度看起来好像有点大...但是压一下位的话就是O((n*m)^3 / 64), 常数小, 实际也跑得很快. 

    -------------------------------------------------------------------------------------

    #include<cstdio>
    #include<bitset>
    #include<cstring>
    #include<algorithm>
     
    using namespace std;
     
    const int maxn = 1609;
    const int dx[4] = {-1, 0, 0, 1};
    const int dy[4] = {0, 1, -1, 0};
     
    bitset<maxn> mat[maxn];
    int n, m, N, ans[maxn];
    bool F[maxn];
     
    void Solve() {
    int cur = 0;
    memset(F, 0, sizeof F);
    for(int var = 0; var < N; var++) {
    for(int j = cur; j < N; j++) if(mat[j][var]) {
    if(j != cur)
    swap(mat[j], mat[cur]);
    break;
    }
    if(mat[cur][var]) {
    for(int j = cur; ++j < N; )
    if(mat[j][var]) mat[j] ^= mat[cur];
    cur++;
    F[var] = true;
    }
    }
    for(int i = N; i--; ) {
    int &t = ans[i];
    if(F[i]) {
    t = 0;
    for(int j = i; ++j < N; )
    if(mat[i][j]) t ^= ans[j];
    } else
    t = 1;
    }
    }
     
    int main() {
    scanf("%d%d", &n, &m);
    N = n * m;
    for(int i = 0; i < N; i++)
    mat[i].reset();
    for(int i = 0; i < n; i++)
    for(int j = 0; j < m; j++) {
    int cur = i * m + j;
    mat[cur][cur] = 1;
    for(int d = 0; d < 4; d++) {
    int x = i + dx[d], y = j + dy[d];
    if(0 <= x && x < n && 0 <= y && y < m)
    mat[cur][x * m + y] = 1;
    }
    }
    Solve();
    for(int i = 0; i < n; i++) {
    for(int j = 0; j < m; j++)
    printf("%d ", ans[i * m + j] ? 1 : 0);
    puts("");
    }
    return 0;
    }

    -------------------------------------------------------------------------------------

    3503: [Cqoi2014]和谐矩阵

    Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge
    Submit: 706  Solved: 311
    [Submit][Status][Discuss]

    Description

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

    Input

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

    Output


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

    Sample Input

    4 4

    Sample Output

    0100
    1110
    0001
    1101

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

    HINT

    Source

  • 相关阅读:
    IDEA插件备忘录
    SpringBoot2基础笔记
    EasyCode模板,配合通用mapper,dubbo项目使用
    七牛云存储
    Apache POI
    SSM项目中关于配置的一二三
    SSM整合笔记
    Spring5学习笔记
    ThinkPHP框架,按分类,计算商品价格区间,来完成价格搜索
    PHP常用符号和函数
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/5211317.html
Copyright © 2011-2022 走看看