zoukankan      html  css  js  c++  java
  • 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("
    ");
        }
        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("
    ");
    	}
    	return 0;
    }
    

      

    3503: [Cqoi2014]和谐矩阵

    Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge
    Submit: 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

    HINT

     

    Source

    [Submit][Status][Discuss]
  • 相关阅读:
    September 17th 2016 Week 38th Saturday
    【2016-09-16】UbuntuServer14.04或更高版本安装问题记录
    September 16th 2016 Week 38th Friday
    September 11th 2016 Week 38th Sunday
    September 12th 2016 Week 38th Monday
    September 10th 2016 Week 37th Saturday
    September 9th 2016 Week 37th Friday
    c++暂停
    八皇后问题
    ( 转转)Android初级开发第九讲--Intent最全用法(打开文件跳转页面等)
  • 原文地址:https://www.cnblogs.com/fighting-to-the-end/p/5697878.html
Copyright © 2011-2022 走看看