제출 #1358887

#제출 시각아이디문제언어결과실행 시간메모리
1358887altern23Plus Minus (BOI17_plusminus)C++20
100 / 100
93 ms12792 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long

const int MOD = 1e9+7;

ll expo(ll a, ll b) {
      ll ans = 1;
      while (b > 0) {
            if (b&1) ans = ans*a%MOD;
            a = a*a%MOD;
            b /= 2;
      }
      return ans;
}

int main() {
      ios_base::sync_with_stdio(0); cin.tie(0);
      int tc = 1;
      // cin >> tc;
      while (tc--) {
            ll N, M, K; cin >> N >> M >> K;

            map <ll, ll> check_N, check_M;
            bool can_N = 1, can_M = 1, ch = 1;
            
            ll G = -1;

            for (int i = 1; i <= K; i++) {
                  char sign; cin >> sign;
                  ll z = (sign == '+');
                  ll r, c; cin >> r >> c;
                  if (G == -1) {
                        G = (r+c)%2 == z;
                  }
                  else {
                        ch &= (G == ((r+c)%2 == z));
                  }

                  if (check_N.count(r)) {
                        if (check_N[r] != (c%2 == z)) {
                              can_N = 0;
                        }
                  }
                  check_N[r] = (c%2 == z);
                  if (check_M.count(c)) {
                        if (check_M[c] != (r%2 == z)) {
                              can_M = 0;
                        }
                  }
                  check_M[c] = (r%2 == z);
            }

            ll ans = (can_N*expo(2, N-check_N.size())+can_M*expo(2, M-check_M.size()))%MOD;

            if (!K) {
                  ans -= 2LL-MOD;
                  ans %= MOD;
            }
            else {
                  ans -= ch-MOD;
                  ans %= MOD;
            }

            cout << ans << "\n";
            
      }
}

/*

*/
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…