当前位置:Gxlcms > html代码 > CF#277(Div.2)B.(预处理)_html/css_WEB-ITnose

CF#277(Div.2)B.(预处理)_html/css_WEB-ITnose

时间:2021-07-01 10:21:17 帮助过:5人阅读

B. OR in Matrix

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

题目链接: http://codeforces.com/contest/486/problem/B

Let's define logical OR as an operation on two logical values (i. e. values that belong to the set {0,?1}) that is equal to 1 if either or both of the logical values is set to 1, otherwise it is 0. We can define logical OR of three or more logical values in the same manner:

where is equal to 1 if some ai?=?1, otherwise it is equal to 0.

Nam has a matrix A consisting of m rows and n columns. The rows are numbered from 1 to m, columns are numbered from 1 to n. Element at row i (1?≤?i?≤?m) and column j (1?≤?j?≤?n) is denoted as Aij. All elements of A are either 0 or 1. From matrix A, Nam creates another matrix B of the same size using formula:

.

(Bij is OR of all elements in row i and column j of matrix A)

Nam gives you matrix B and challenges you to guess matrix A. Although Nam is smart, he could probably make a mistake while calculating matrix B, since size of A can be large.

Input

The first line contains two integer m and n (1?≤?m,?n?≤?100), number of rows and number of columns of matrices respectively.

The next m lines each contain n integers separated by spaces describing rows of matrix B (each element of B is either 0 or 1).

Output

In the first line, print "NO" if Nam has made a mistake when calculating B, otherwise print "YES". If the first line is "YES", then also print mrows consisting of n integers representing matrix A that can produce given matrix B. If there are several solutions print any one.

Sample test(s)

input

2 21 00 0

output

NO

input

2 31 1 11 1 1

output

YES1 1 11 1 1

input

2 30 1 01 1 1

output

YES0 0 00 1 0
解题思路:
	题目大意就是给你m和n,接下来输入m*n的B矩阵,问是否存在一个m*n的A矩阵,使得对于Bij这个元素来说,它是由A矩阵的第i行所有元素和第j列所有元素“或运算”得来。存在的话
输出YES,并输出任意一组符合条件的A矩阵,否则输出NO。
	我的方法还是偏暴力,首先开一个二维数组存A矩阵,并对其初始化元素全为1。首先这样考虑,如果Bij对应的值为0,那么A矩阵的第i行和第j列一定全部为0,出现一个1都不行,因为“或运算”全0出0。这样更新一遍后,A矩阵的0的位置就能全部确定了。接下来最暴力的部分O(n*m*max(n,m))的判断A矩阵每个位置的元素是否满足B矩阵中0或1的条件。最后flag没变的话,说明存在这样的A矩阵,同时A矩阵也被我们更新好了,
输出即可;反之,不存在输出NO。
完整代码:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;#pragma comment(linker, "/STACK:102400000,102400000")typedef long long LL;typedef double DB;typedef unsigned uint;typedef unsigned long long uLL;/** Constant List .. **/ //{const int MOD = int(1e9)+7;const int INF = 0x3f3f3f3f;const LL INFF = 0x3f3f3f3f3f3f3f3fLL;const DB EPS = 1e-9;const DB OO = 1e20;const DB PI = acos(-1.0); //M_PI;int n , m;int g[1111][1111];int res[1111][1111];bool check_0(int x , int y){    for(int i = 0 ; i < m ; i ++)    {        if(res[x][i] == 1)            return false;    }    for(int i = 0 ; i < n ; i ++)    {        if(res[i][y] == 1)            return false;    }    return true;}bool check_1(int x , int y){    for(int i = 0 ; i < m ; i ++)    {        if(res[x][i] == 1)            return true;    }    for(int i = 0 ; i < n ; i ++)    {        if(res[i][y] == 1)            return true;    }    return false;}int main(){    #ifdef DoubleQ    freopen("in.txt","r",stdin);    #endif    while(~scanf("%d%d",&m,&n))    {        for(int i = 0 ; i < m ; i ++)        {            for(int j = 0 ; j < n ; j ++)            {                scanf("%d",&g[i][j]);            }        }        for(int i = 0 ; i < m ; i ++)        {            for(int j = 0 ; j < n ; j ++)            {                res[i][j] = 1;            }        }        //int flag = 0 ;        for(int i = 0 ; i < m ; i ++)        {            for(int j = 0 ; j < n ; j ++)            {                if(g[i][j] == 0)                {                    for(int k = 0 ; k < n ; k ++)                        res[i][k] = 0;                    for(int k = 0 ; k < m ; k ++)                        res[k][j] = 0;                }            }        }        int flag1 = 0;        for(int i = 0 ; i < m ; i ++)        {            for(int j = 0 ; j < n ; j ++)            {                if(g[i][j] == 0)                {                    if(!check_0(i , j))                        flag1 = 1;                }                else if(g[i][j] == 1)                {                    if(!check_1(i , j))                        flag1 = 1;                }                if(flag1)                    break;            }            if(flag1)                break;        }        if(flag1)            printf("NO\n");        else        {            printf("YES\n");            for(int i = 0  ; i < m  ; i ++)            {                for(int j = 0 ; j < n ; j ++)                {                    printf("%d%c",res[i][j], j == n - 1 ? '\n' : ' ');                }            }        }    }}


人气教程排行