제출 #550442

#제출 시각아이디문제언어결과실행 시간메모리
550442Jarif_RahmanPlus Minus (BOI17_plusminus)C++17
100 / 100
120 ms13332 KiB
#include <bits/stdc++.h> #define pb push_back #define f first #define sc second using namespace std; typedef long long int ll; typedef string str; const ll md = 1e9+7; ll pw(ll x, ll p){ if(p == 0) return 1; if(p%2 == 0) return pw((x*x)%md, p/2); return (pw(x, p-1)*x)%md; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); ll n, m; int k; cin >> n >> m >> k; vector<tuple<str, ll, ll>> points(k); for(auto &[c, x, y]: points) cin >> c >> x >> y; ll ans = 0; { bool ok = 1; ll cnt = n; map<ll, bool> mp; for(int i = 0; i < k; i++){ auto [c, x, y] = points[i]; if(mp.find(x) == mp.end()){ mp[x] = ((c=="+")!=(y%2==1)); cnt--; } else{ if(mp[x] != ((c=="+")!=(y%2==1))) ok = 0; } } if(ok) ans+=pw(2, cnt), ans%=md; } { bool ok = 1; ll cnt = m; map<ll, bool> mp; for(int i = 0; i < k; i++){ auto [c, x, y] = points[i]; if(mp.find(y) == mp.end()){ mp[y] = ((c=="+")!=(x%2==1)); cnt--; } else{ if(mp[y] != ((c=="+")!=(x%2==1))) ok = 0; } } if(ok) ans+=pw(2, cnt), ans%=md; } { bool ok1 = 1, ok2 = 1; for(int i = 0; i < k; i++){ auto [c, x, y] = points[i]; if((x+y)%2 == (c=="+")) ok1 = 0; else ok2 = 0; } if(ok1) ans--; if(ok2) ans--; ans%=md; if(ans < 0) ans+=md; } cout << ans << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...