제출 #1080449

#제출 시각아이디문제언어결과실행 시간메모리
1080449andrei_iorgulescuPlus Minus (BOI17_plusminus)C++14
100 / 100
144 ms21332 KiB
#include <bits/stdc++.h> using namespace std; int modulo = 1e9 + 7; int n,m,k; int lgpow(int x, int y) { int z = 1; while (y != 0) { if (y % 2 == 1) z = 1ll * z * x % modulo; x = 1ll * x * x % modulo; y /= 2; } return z; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n >> m >> k; bool nah1 = false, nah2 = false; set<int> ff1, ff2; map<int,int> lin, col; bool could_be_chessboard_1 = true, could_be_chessboard_2 = true; for (int i = 1; i <= k; i++) { char spin; int x,y; cin >> spin >> x >> y; ff1.insert(x); ff2.insert(y); if (spin == '+' and (x + y) % 2 == 0) could_be_chessboard_1 = false; if (spin == '+' and (x + y) % 2 == 1) could_be_chessboard_2 = false; if (spin == '-' and (x + y) % 2 == 0) could_be_chessboard_2 = false; if (spin == '-' and (x + y) % 2 == 1) could_be_chessboard_1 = false; if (spin == '+') { if (lin[x] != 0) { if (lin[x] != 1 + y % 2) { nah1 = true; } } else lin[x] = 1 + y % 2; } else { if (lin[x] != 0) { if (lin[x] != 1 + (y - 1) % 2) { nah1 = true; } } else lin[x] = 1 + (y - 1) % 2; } if (spin == '+') { if (col[y] != 0) { if (col[y] != 1 + x % 2) { nah2 = true; } } else col[y] = 1 + x % 2; } else { if (col[y] != 0) { if (col[y] != 1 + (x - 1) % 2) { nah2 = true; } } else col[y] = 1 + (x - 1) % 2; } } int ans = 0; if (!nah1) ans += lgpow(2, n - (int)ff1.size()); if (!nah2) ans += lgpow(2, m - (int)ff2.size()); if (could_be_chessboard_1) ans--; if (could_be_chessboard_2) ans--; cout << ans % modulo; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...