BZOJ3503:[CQOI2014]和谐矩阵(高斯消元,bitset)

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         else29         {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\n",ans[id(i,m)]);54     }55 }

转载于:https://www.cnblogs.com/refun/p/8953107.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107559.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 计算机组成原理_第四版课后习题答案(完整版)

    计算机组成原理_第四版课后习题答案(完整版)计算机组成原理_第四版课后习题答案(完整版)第一章1.比较数字计算机和模拟计算机的特点。解:模拟计算机的特点:数值由连续量来表示,运算过程是连续的;数字计算机的特点:数值由数字量(离散量)来表示,

    2022年8月2日
    6
  • 关于ModifyStyleEx无效的问题

    关于ModifyStyleEx无效的问题在做MFC时,有时候我们需要显示选择一个项目,比如需要标记所选择的图片控件。我们可以用这个函数:BOOLModifyStyleEx(  DWORD dwRemove,  DWORD dwAdd,  UINT   nFlags)或者BOOLModif

    2022年7月19日
    14
  • windows安装深度linux,最漂亮的国产Linux,windows下安装深度操作系统步骤

    windows安装深度linux,最漂亮的国产Linux,windows下安装深度操作系统步骤GIF国产操作系统都是基于Linux进行的二次开发,有很多国产系统只是在Linux基础上进行一些美化、内置几个软件就号称自己是操作系统了。而为什么深度操作系统deepinLinux一直深受用户喜爱呢?虽然它也是基于Linux内核,但它的整个系统架构设计都是自己研发制作的。从显示管理器、资源管理器再到桌面环境及比较实用的深度全家桶,在这个系统上,你不仅可以Linux原生的软件,还可以使用QQ、TI…

    2022年5月13日
    66
  • keyvaluepair_KeyValuePair用法(转)

    keyvaluepair_KeyValuePair用法(转)C#KeyValuePair的用法。结构体,定义可设置或检索的键/值对。也就是说我们可以通过它记录一个键/值对这样的值。比如我们想定义一个ID(int类型)和Name(string类型)这样的键/值对,那么可以这样使用。//////设置键/值对//////privateKeyValuePairSetKeyValuePair(){intintKey=1;stringstrV…

    2022年7月26日
    8
  • .NET(c#) 移动APP开发平台 – Smobiler(1)

    .NET(c#) 移动APP开发平台 – Smobiler(1)如果说基于.net的移动开发平台,目前比较流行的可能是xamarin了,不过除了这个,还有一个比xamarin更好用的国内的.net移动开发平台,smobiler,不用学习另外一套开发模式或者搭建复杂的开发环境,smobiler能够让大家像开发传统windows一样去开发移动应用,那么列举一下这个平台的特点。1. 基于VisualStudio的可视化开发。如同开发传统Windows平台一样的…

    2022年5月6日
    167
  • xcode armv7 armv7s arm64

    armv6armv7armv7sarm64引起编译包翻倍增大的问题,下边来说一下关于ios这个指令集目前ios的指令集有以下几种:armv6iPhoneiPhone2iPhone3G第一代和第二代iPodToucharmv7iPhone4iPhone4Sarmv7siPhone5iPho

    2022年4月9日
    223

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号