#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N, M, K;
cin >> N >> M >> K;
// Solution:
// Note that, if there is a cell (a, b) == (a + 1, b),
// and acell (c, d) == (c, d + 1), it is impossible.
//
// Proof:
// If (a, b) == (a + 1, b), then (a, x) == (a + 1, x)
// for all x, and if their b's parity is different they
// have different signs. So, if (a, b) == (a + 1, b),
// this implies (c, d) == (c + 1, d), (c, d) == (c, d +1).
// However, we cannot have 3 equal signs in 2 * 2 square.
//
// If there is (a, b) == (a + 1, b), then that means
// all rows have alternating signs (and we can ignore columns
// condition). So the answer is 2^{free_row} for this case.
//
// Thus, we only need to keep track whether the row and column
// is free, as well as the checkerboard pattern.
//
// Time complexity: O(K log K).
const int mod = 1e9 + 7;
const auto power = [&](int a, int x) {
int z = 1;
while (x) {
if (x & 1) z = 1ll * z * a % mod;
a = 1ll * a * a % mod;
x /= 2;
}
return z;
};
map<int, int> R, C;
bool freeRow = true;
bool freeCol = true;
bool checkerBoard1 = true;
bool checkerBoard2 = true;
while (K--) {
char ch;
cin >> ch;
int t = ch == '+' ? 1 : -1;
int r, c;
cin >> r >> c;
// If in a row, sign is not alternating, then row is dependent on column
freeRow &= R[r] == 0 || R[r] == t * (c % 2 == 0 ? 1 : -1); R[r] = t * (c % 2 == 0 ? 1 : -1);
// If in a column, sign is not alternating, then column is dependent on row
freeCol &= C[c] == 0 || C[c] == t * (r % 2 == 0 ? 1 : -1); C[c] = t * (r % 2 == 0 ? 1 : -1);
checkerBoard1 &= (t * ((r + c) % 2 == 0 ? 1 : -1)) == +1;
checkerBoard2 &= (t * ((r + c) % 2 == 0 ? 1 : -1)) == -1;
}
int ans = 0;
ans += freeRow ? power(2, N - R.size()) : 0;
ans += freeCol ? power(2, M - C.size()) : 0;
ans -= freeRow && freeCol && checkerBoard1;
ans -= freeRow && freeCol && checkerBoard2;
ans %= mod;
cout << ans << '\n';
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
256 KB |
Output is correct |
2 |
Correct |
1 ms |
204 KB |
Output is correct |
3 |
Correct |
1 ms |
204 KB |
Output is correct |
4 |
Correct |
1 ms |
312 KB |
Output is correct |
5 |
Correct |
1 ms |
204 KB |
Output is correct |
6 |
Correct |
1 ms |
204 KB |
Output is correct |
7 |
Correct |
1 ms |
204 KB |
Output is correct |
8 |
Correct |
1 ms |
204 KB |
Output is correct |
9 |
Correct |
1 ms |
204 KB |
Output is correct |
10 |
Correct |
1 ms |
312 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
256 KB |
Output is correct |
2 |
Correct |
1 ms |
204 KB |
Output is correct |
3 |
Correct |
1 ms |
204 KB |
Output is correct |
4 |
Correct |
1 ms |
312 KB |
Output is correct |
5 |
Correct |
1 ms |
204 KB |
Output is correct |
6 |
Correct |
1 ms |
204 KB |
Output is correct |
7 |
Correct |
1 ms |
204 KB |
Output is correct |
8 |
Correct |
1 ms |
204 KB |
Output is correct |
9 |
Correct |
1 ms |
204 KB |
Output is correct |
10 |
Correct |
1 ms |
312 KB |
Output is correct |
11 |
Correct |
2 ms |
332 KB |
Output is correct |
12 |
Correct |
1 ms |
204 KB |
Output is correct |
13 |
Correct |
1 ms |
204 KB |
Output is correct |
14 |
Correct |
2 ms |
332 KB |
Output is correct |
15 |
Correct |
2 ms |
332 KB |
Output is correct |
16 |
Correct |
61 ms |
1276 KB |
Output is correct |
17 |
Correct |
61 ms |
1220 KB |
Output is correct |
18 |
Correct |
62 ms |
1348 KB |
Output is correct |
19 |
Correct |
71 ms |
1264 KB |
Output is correct |
20 |
Correct |
68 ms |
1260 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
256 KB |
Output is correct |
2 |
Correct |
1 ms |
204 KB |
Output is correct |
3 |
Correct |
1 ms |
204 KB |
Output is correct |
4 |
Correct |
1 ms |
312 KB |
Output is correct |
5 |
Correct |
1 ms |
204 KB |
Output is correct |
6 |
Correct |
1 ms |
204 KB |
Output is correct |
7 |
Correct |
1 ms |
204 KB |
Output is correct |
8 |
Correct |
1 ms |
204 KB |
Output is correct |
9 |
Correct |
1 ms |
204 KB |
Output is correct |
10 |
Correct |
1 ms |
312 KB |
Output is correct |
11 |
Correct |
2 ms |
332 KB |
Output is correct |
12 |
Correct |
1 ms |
204 KB |
Output is correct |
13 |
Correct |
1 ms |
204 KB |
Output is correct |
14 |
Correct |
2 ms |
332 KB |
Output is correct |
15 |
Correct |
2 ms |
332 KB |
Output is correct |
16 |
Correct |
61 ms |
1276 KB |
Output is correct |
17 |
Correct |
61 ms |
1220 KB |
Output is correct |
18 |
Correct |
62 ms |
1348 KB |
Output is correct |
19 |
Correct |
71 ms |
1264 KB |
Output is correct |
20 |
Correct |
68 ms |
1260 KB |
Output is correct |
21 |
Correct |
119 ms |
7284 KB |
Output is correct |
22 |
Correct |
1 ms |
204 KB |
Output is correct |
23 |
Correct |
115 ms |
7268 KB |
Output is correct |
24 |
Correct |
116 ms |
7252 KB |
Output is correct |
25 |
Correct |
119 ms |
7220 KB |
Output is correct |
26 |
Correct |
113 ms |
9832 KB |
Output is correct |
27 |
Correct |
128 ms |
9820 KB |
Output is correct |
28 |
Correct |
110 ms |
9912 KB |
Output is correct |
29 |
Correct |
132 ms |
9920 KB |
Output is correct |
30 |
Correct |
140 ms |
11716 KB |
Output is correct |