mojo's Blog
#589 (Div.2) B - Filling the Grid 본문
문제 링크 => Problem - B - Codeforces
이 문제에서 뇌절을 한 이유를 적어보려고 한다.
1. cell 을 채우는 과정에서 r, c가 달라지는 경우를 고려하지 못함
=> 먼저 r을 채우고 c를 채우는 과정에서 cell을 채울 경우와 채우지 못할 영역을 표시해야 한다.
cell을 채울 경우 r에서 cell을 채우지 못할 영역을 표시한 곳을 채운다면 이경우는 r, c가 달라지는 경우이다.
따라서 바로 0을 출력하면 끝이다.
cell을 채우지 못할 영역을 표시할 경우 r에서 cell을 채운 곳이라면 이 또한 r, c가 달라지는 경우이다.
따라서 바로 0을 출력하면 끝이다.
2. 모든 cell 을 채웠을 때 r, c에 영향을 미치지 않도록 하는 cell 의 갯수가 0개일 경우 cell 그대로인 경우로 1을 출력해야 하는데 0을 출력한 경우
=> 조건을 나누지 말고 동일하게 for문을 돌려서 result 값을 만들면 그만이다.
Solution Code
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <algorithm>
#include <string.h>
#include <cstring>
#include <queue>
#include <stack>
#define endl '\n'
#define INF 1000000000
#define ll long long
using namespace std;
int H[1004], W[1004];
int Map[1004][1004];
int main()
{
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int h, w;
cin >> h >> w;
for (int i = 1; i <= h; i++) {
cin >> H[i];
for (int j = 1; j <= H[i]; j++) Map[i][j] = 1;
Map[i][H[i] + 1] = -1;
}
for (int i = 1; i <= w; i++) {
cin >> W[i];
for (int j = 1; j <= W[i]; j++) {
if (Map[j][i] == -1) {
cout << 0 << endl;
return 0;
}
Map[j][i] = 1;
}
if (Map[W[i] + 1][i] == 1) {
cout << 0 << endl;
return 0;
}
Map[W[i] + 1][i] = -1;
}
int cnt = 0;
for (int i = 1; i <= h; i++) {
for (int j = 1; j <= w; j++) {
if (Map[i][j] == 0) cnt++;
}
}
ll result = 1;
for (int i = 0; i < cnt; i++) {
result = (result * 2) % 1000000007;
}
cout << result << endl;
return 0;
}
'코드포스' 카테고리의 다른 글
#743 (Div.2) C - Book (0) | 2021.09.27 |
---|---|
#743 (Div.2) B - Swaps (0) | 2021.09.27 |
#Educational Codeforces Round 114 (Div.2) C - Slay the dragon (0) | 2021.09.21 |
#Educational Codeforces Round 72 B - Zmei Gorynich (0) | 2021.09.11 |
#742 (Div.2) B - MEX or Mixup (0) | 2021.09.06 |
Comments