bzoj3503: [Cqoi2014]和谐矩阵
高斯消元解异或方程组。学了bitset。对比如下
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define REP(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define clr(x,c) memset(x,c,sizeof(x)) int read(){ int x=0;char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) x=x*10+c-'0',c=getchar(); return x; } const int nmax=50; const int inf=0x7f7f7f7f; int xx[5]={0,0,0,1,-1}; int yy[5]={0,1,-1,0,0}; int a[nmax*nmax][nmax*nmax],ans[nmax*nmax],n,m; int id(int x,int y){ return (x-1)*m+y; } void Gauss(int N,int M){ REP(i,1,N){ int j; for(j=i;j<=N&&!a[j][i];j++) if(j>N) continue; if(j!=i) REP(k,i,M) swap(a[i][k],a[j][k]); REP(j,i+1,N) if(a[j][i]) REP(k,i,M) a[j][k]^=a[i][k]; } dwn(i,N,1){ if(!a[i][i]) ans[i]=1; else{ REP(j,i+1,N) a[i][M]^=(ans[j]*a[i][j]); ans[i]=a[i][M]; } } } int main(){ n=read(),m=read(); REP(i,1,n) REP(j,1,m) REP(k,0,4) { int tx=i+xx[k],ty=j+yy[k]; if(tx&&ty&&tx<=n&&ty<=m) a[id(i,j)][id(tx,ty)]=1; } Gauss(n*m,n*m+1); REP(i,1,n) { REP(j,1,m) printf("%d ",ans[id(i,j)]);printf("\n"); } return 0; }
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<bitset> using namespace std; #define REP(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define clr(x,c) memset(x,c,sizeof(x)) int read(){ int x=0;char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) x=x*10+c-'0',c=getchar(); return x; } const int nmax=2505;; const int inf=0x7f7f7f7f; int xx[5]={0,0,0,1,-1}; int yy[5]={0,1,-1,0,0}; int ans[nmax],n,m; bitset<nmax>a[nmax]; int id(int x,int y){ return (x-1)*m+y; } void Gauss(int N,int M){ REP(i,1,N){ int j; for(j=i;j<=N&&!a[j][i];j++) if(j>N) continue; if(j!=i) swap(a[j],a[i]); REP(j,i+1,N) if(a[j][i]) a[j]^=a[i]; } dwn(i,N,1){ if(!a[i][i]) ans[i]=1; else{ REP(j,i+1,N) if(a[i][j]) ans[i]^=ans[j];//a[i][M]^=ans[j];//a[i][M]^=(ans[j]*a[i][j]); } } } int main(){ n=read(),m=read(); REP(i,1,n*m) a[i].reset(); REP(i,1,n) REP(j,1,m) REP(k,0,4) { int tx=i+xx[k],ty=j+yy[k]; if(tx&&ty&&tx<=n&&ty<=m) a[id(i,j)][id(tx,ty)]=1; } Gauss(n*m,n*m+1); REP(i,1,n) { REP(j,1,m) printf("%d ",ans[id(i,j)]);printf("\n"); } return 0; }
3503: [Cqoi2014]和谐矩阵
Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 877 Solved: 397
[Submit][Status][Discuss]
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
1 1 1 0
0 0 0 1
1 1 0 1
数据范围
1 <=m, n <=40