bzoj
luogu

题意

给出\(n,m\)要求构造一个\(n \times m\)的\(01\)矩阵使得每个点及其上下左右(如果有的话)的元素的异或和为\(0\)。构造出来的矩阵不能全是\(0\)。
\(n,m\le40\)

sol

如何保证解出来不是全\(0\)?只要对于每个自由元都强制设成\(1\)就可以了。

想都不要想就可以列出\(n\times m\)个方程然后跑\(O((nm)^3)\)的高斯消元。

一开始我还以为跑不过,然而。。。

\(1600\times1600\times1600\div64=64000000\)

这居然是正确的复杂度。。。

所以这题暴力就直接艹过去了。弄得我都不想写正解了

以下是暴力代码。

code

#include<cstdio>
#include<algorithm>
#include<bitset>
using namespace std;
int gi()
{int x=0,w=1;char ch=getchar();while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();if (ch=='-') w=0,ch=getchar();while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return w?x:-x;
}
const int N = 1605;
int n,m,tot,id[45][45],sol[N];
bitset<N>a[N];
int main()
{n=gi();m=gi();for (int i=1;i<=n;++i)for (int j=1;j<=m;++j)id[i][j]=++tot;for (int i=1;i<=n;++i)for (int j=1;j<=m;++j){a[id[i][j]][id[i][j]]=1;if (i>1) a[id[i][j]][id[i-1][j]]=1;if (j>1) a[id[i][j]][id[i][j-1]]=1;if (i<n) a[id[i][j]][id[i+1][j]]=1;if (j<m) a[id[i][j]][id[i][j+1]]=1;}for (int i=1;i<=tot;++i){if (!a[i][i]){for (int j=i+1;j<=tot;++j)if (a[j][i]) {swap(a[i],a[j]);break;}}for (int j=i+1;j<=tot;++j)if (a[j][i]) a[j]^=a[i];}for (int i=tot;i;--i){sol[i]=a[i][tot+1];for (int j=tot;j>i;--j)if (a[i][j]) sol[i]^=sol[j];if (!a[i][i]) sol[i]=1;}for (int i=1;i<=n;++i,puts(""))for (int j=1;j<=m;++j)printf("%d ",sol[id[i][j]]);return 0;
}

下面是正解。

因为上面的一个方程里面只有至多\(5\)个变量拿去跑\(O(n^3)\)的高斯消元太不划算了,我们考虑把一些方程代入其他方程里面。

考虑只对第一行设元。由于第一行的每个点要满足

\[a_{1,j} \oplus a_{1,j-1} \oplus a_{1,j+1} \oplus a_{2,j}=0\]

(越界会默认是\(0\)所以没关系的)

那么也就是

\[a_{2,j}=a_{1,j} \oplus a_{1,j-1} \oplus a_{i,j+1}\]

以此类推,这样每一个\(a_{i,j}\)都可以用\(m\)个第一行的未知量来表示。最后就只要对最后一行满足的条件(即\(a_{n,j} \oplus a_{n,j-1} \oplus a_{n,j+1} \oplus a_{n-1,j}=0\))解方程就可以了。

复杂度\(O(n^3)\)

code

#include<cstdio>
#include<algorithm>
#include<bitset>
using namespace std;
int gi()
{int x=0,w=1;char ch=getchar();while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();if (ch=='-') w=0,ch=getchar();while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return w?x:-x;
}
const int N = 45;
int n,m,ans[N][N];
bitset<45>a[N][N],b[N];
int main()
{n=gi();m=gi();for (int j=1;j<=m;++j) a[1][j][j]=1;for (int i=2;i<=n;++i)for (int j=1;j<=m;++j)a[i][j]=a[i-1][j-1]^a[i-2][j]^a[i-1][j]^a[i-1][j+1];for (int j=1;j<=m;++j) b[j]=a[n][j-1]^a[n-1][j]^a[n][j]^a[n][j+1];for (int i=1;i<=m;++i){if (!b[i][i]){for (int j=i+1;j<=m;++j)if (b[j][i]) {swap(b[i],b[j]);break;}}for (int j=i+1;j<=m;++j)if (b[j][i]) b[j]^=b[i];}for (int i=m;i;--i){ans[1][i]=0;for (int j=m;j>i;--j)if (b[i][j]) ans[1][i]^=ans[1][j];if (!b[i][i]) ans[1][i]=1;}for (int i=2;i<=n;++i)for (int j=1;j<=m;++j)ans[i][j]=ans[i-1][j-1]^ans[i-2][j]^ans[i-1][j]^ans[i-1][j+1];for (int i=1;i<=n;++i,puts(""))for (int j=1;j<=m;++j)printf("%d ",ans[i][j]);return 0;
}

转载于:https://www.cnblogs.com/zhoushuyu/p/8796442.html

[BZOJ3503][CQOI2014]和谐矩阵相关推荐

  1. bzoj3503: [Cqoi2014]和谐矩阵

    高斯消元解异或方程组.学了bitset.对比如下 #include<cstdio> #include<cstring> #include<iostream> #in ...

  2. bzoj 3503: [Cqoi2014]和谐矩阵(高斯消元)

    3503: [Cqoi2014]和谐矩阵 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge Submit: 1101  Solved ...

  3. [CQOI2014]和谐矩阵

    嘟嘟嘟 遇到这种(看似)构造的题,我好像一般都做不出来-- 然而这题正解是高斯消元解异或方程组-- 首先我们容易列出式子a[i][j] ^ a[i - 1][j] ^ a[i + 1][j] ^ a[ ...

  4. bzoj3503【CQOI2014】和谐矩阵

    3503: [Cqoi2014]和谐矩阵 Time Limit: 10 Sec   Memory Limit: 128 MBSec   Special Judge Submit: 841   Solv ...

  5. 【BZOJ3503】【Cqoi2014】和谐矩阵 高斯消元,解异或方程组

    #include <stdio.h> int main() {puts("转载请注明出处");puts("地址:blog.csdn.net/vmurder/a ...

  6. JZOJ 3596. 【CQOI2014】和谐矩阵

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

  7. [暑假的bzoj刷水记录]

    (这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊  堆一起算了 隔一段更新一下.  7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...

  8. bzoj 乱刷计划 50/50

    前言 话说第一个板刷计划由于种种原因而告一段落了..其实那一版还有很多题想做,那就只能放一放了 附上效果图一张(几乎每一题都在我博客有题解): 打算 可以复习,重做自己做过的题,不局限于没做过的 乱刷 ...

  9. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

  10. linux系统数据库类型,linux系统下调度数据库类型资源库中的kettle job

    已经存在kettle的一个资源库enfo,在目录/works/wxj下面有一个job (testmailsuccess.kjb)如何实现手工在kettle外部执行此job和让系统每天定时的调用此job ...

最新文章

  1. document.getElementById与document.getElementsById的区别
  2. 输出EXCEL文件的通用函数
  3. gradle wrapper 版本与 android build tool 版本匹配要求
  4. 【数据库】数据库系统的结构(概念篇详解)
  5. CF755G PolandBall and Many Other Balls(多项式/倍增fft)
  6. 移动端开发 main.js入口文件
  7. 嵌入式linux只读保护,如何使用squashfs只读文件系统制作Linux系统文件
  8. 素数的线性筛法java,埃氏筛 线性筛(欧拉筛) 算法解析
  9. 很多事情都由计算机或机器人来完成英语,八年级下英语作文
  10. 使用Python将Excel文件中的数据插入MySQL数据库,你学会了吗?
  11. Java中涉及线程和并发相关的内容
  12. Java 批量下载图片并压缩为Zip
  13. 零售的哲学前三章读后感
  14. 小张的个人信息管理系统
  15. WHMCS V7.60 新增短信宝短信插件
  16. 【计算机网络】IP地址详解
  17. UninstallToo卸载软件
  18. 恭贺经纬恒润参股企业“挚途科技”实现L3级自动驾驶重卡商业化落地
  19. NGINX配置多域名
  20. linux分辨率自动恢复,Linux系统Manjaro分辨率调整恢复

热门文章

  1. 关于iconfont字体图标在IE上无法显示的问题
  2. PID调节经验知识梳理
  3. Pycahrm pip instell parsel时出现错误 error: Unable to find vcvarsall.bat解决过程
  4. JarvisOJ 逆向Writeup
  5. 前端基础—— 选择器 、css
  6. python txt转为csv
  7. “萝卜快跑”,“快”不起来——百度Robotaxi试乘体验
  8. c语言 pow算圆的面积,简单微积分--积分求圆的面积
  9. Thinkpad E430c 无线开关
  10. yd什么意思_YD是什么意思