您的当前位置:首页正文

CF#277(Div.2)B.(预处理)_html/css

2022-06-15 来源:知库网

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' : ' '); } } } }}

显示全文