Submission #484656

#TimeUsernameProblemLanguageResultExecution timeMemory
484656SirCovidThe19thPlus Minus (BOI17_plusminus)C++17
100 / 100
342 ms44684 KiB
#include <bits/stdc++.h>
using namespace std;

#define FOR(i, x, y) for (int i = x; i < y; i++)
#define ll long long
#define pii pair<int, int>
#define f first
#define s second

const int md = 1e9 + 7;

int n, m, k; ll ans; map<int, set<pii>> R, C;

ll binPow(ll a, ll p){
    ll ret = 1;
    for (;p; p /= 2, a = a * a % md) if (p & 1) ret = ret * a % md;
    return ret;
}
void solve(int tot, map<int, set<pii>> mp){
    for (auto &S : mp){
        pii prv = {};
        for (auto cur : S.s){
            if (prv.f and ((cur.f - prv.f) & 1) != (cur.s ^ prv.s)) return;
            prv = cur;
        }
    }
    ans += binPow(2, tot - mp.size());
}
void overCnt(map<int, set<pii>> mp){
    bool case1 = 1, case2 = 1;
    for (auto &S : mp) for (auto cur : S.s){
        int req = (S.f & 1) ^ (cur.f & 1);
        case1 &= (cur.s == req);
        case2 &= (cur.s != req);
    }
    ans -= (case1 + case2);
}

int main(){
    cin >> n >> m >> k;
    FOR(i, 0, k){
        char c; int x, y; cin >> c >> x >> y;
        R[x].insert({y, c == '+'});
        C[y].insert({x, c == '+'});
    }
    solve(n, R); solve(m, C); overCnt(R);
    cout<<(ans + md) % md<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...