ホームページ >ウェブフロントエンド >htmlチュートリアル >CF#277 (ディビジョン 2) B.(前処理)_html/css_WEB-ITnose
マトリックスの B. OR
テストごとの制限時間
1 秒
テストごとのメモリ制限
256 メガバイト
入力
標準入力
出力
標準出力题目链接: http:/ /codeforces.com/contest/486/problem/B
論理 OR を、2 つの論理値 (つまり、集合 {0,?1} に属する値) に対する演算として定義しましょう。または、どちらかの場合は 1 に等しくなります。両方の論理値は 1 に設定され、それ以外の場合は 0 になります。同じ方法で 3 つ以上の論理値の論理 OR を定義できます:
where は、ある ai?=?1 の場合は 1 に等しく、そうでない場合は等しい
Nam には、m 行と n 列で構成される行列 A があります。行には 1 から m までの番号が付けられ、列には 1 から n までの番号が付けられます。行 i (1?≤?i?≤?m)、列 j (1?≤?j?≤?n) の要素は Aij と表されます。 A のすべての要素は 0 または 1 です。Nam は行列 A から、次の式を使用して同じサイズの別の行列 B を作成します:
.
(Bij は行列 A の行 i と列 j のすべての要素の OR です)
Nam は行列 B を与え、行列 A を推測するように要求します。Nam は賢いですが、A のサイズが大きくなる可能性があるため、おそらく行列 B の計算中に間違いを犯す可能性があります。
入力
最初の行には 2 つの整数が含まれていますm と n (1?≤?m,?n?≤?100)、それぞれ行列の行数と列数です
次の m 行にはそれぞれ、行列 B の行を表すスペースで区切られた n 個の整数が含まれています (各要素B の値は 0 または 1)。
出力
最初の行で、Nam が B の計算を間違えた場合は「NO」を出力し、それ以外の場合は「YES」を出力します。最初の行が「YES」の場合、指定された行列 B を生成できる行列 A を表す n 個の整数で構成される mrows も出力します。複数の解がある場合は、いずれかを出力します。
サンプル テスト
入力
2 21 00 0
出力
NO
入力
2 31 1 11 1 1
出力
YES1 1 11 1 1
入力
2 30 1 01 1 1
出力
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。
完整代码:
<pre name="code" class="n">#include <functional>#include <algorithm>#include <iostream>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cstring>#include <climits>#include <cassert>#include <complex>#include <cstdio>#include <string>#include <vector>#include <bitset>#include <queue>#include <stack>#include <cmath>#include <ctime>#include <list>#include <set>#include <map>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' : ' '); } } } }}