제출 #480906

#제출 시각아이디문제언어결과실행 시간메모리
480906hidden1Plus Minus (BOI17_plusminus)C++14
100 / 100
191 ms11744 KiB
#include <bits/stdc++.h> using namespace std; //#pragma GCC optimize ("O3") //#pragma GCC target ("sse4") #ifndef LOCAL #define cerr if(false) cerr #endif #define endl "\n" #define all(x) (x).begin(), (x).end() #define forn(i, n) for(int i = 0; i < n; i ++) #define revn(i, n) for(int i = n - 1; i >= 0; i --) typedef long long ll; template<class T, template<class T2, class A=allocator<T2> > class cont> inline ostream &operator <<(ostream &out, const cont<T> &x) { for(const auto &it : x) { out << it << " ";} return out;} template<class T, template<class T2, class A=allocator<T2> > class cont> inline istream &operator >>(istream &in, cont<T> &x) { for(auto &it : x) { in >> it;} return in;} template<class T, class T2> inline ostream &operator <<(ostream &out, const pair<T, T2> &x) { out << x.first << " " << x.second; return out;} template<class T, class T2> inline istream &operator >>(istream &in, pair<T, T2> &x) { in >> x.first >> x.second; return in;} template<class T, class T2> inline bool chkmax(T &x, const T2 &y) { return x < y ? x = y, 1 : 0; } template<class T, class T2> inline bool chkmin(T &x, const T2 &y) { return x > y ? x = y, 1 : 0; } const ll mod = 1e9 + 7; const int MAX_N = 5010; bool tab1[MAX_N][MAX_N], tab2[MAX_N][MAX_N]; bool onRow[MAX_N], onCol[MAX_N]; int n, m, k; map<int, bool> up, lft; ll fpow(ll x, ll p) { if(p == 0) { return 1; } ll ans = fpow(x, p / 2ll); ans = (ans * ans) % mod; if(p & 1) { return (ans * x) % mod; } else { return ans; } } bool okUp = true, okLeft = true; signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n >> m >> k; ll ret = 0; forn(i, k) { int a, b; char c; cin >> c >> a >> b; int offset = (c == '+'); if(up.find(b) != up.end()) { if(up[b] != ((offset + a) & 1)) { okUp = false; } } else { up[b] = ((offset + a) & 1); } if(lft.find(a) != lft.end()) { if(lft[a] != ((offset + b) & 1)) { okLeft = false; } } else { lft[a] = ((offset + b) & 1); } } if(okUp) { ret = (ret + fpow(2, m - up.size())) % mod; } if(okLeft) { ret = (ret + fpow(2, n - lft.size())) % mod; } if(okLeft && okUp) { if(k == 0) { ret = (ret - 2 + mod) % mod; } else { ret = (ret - 1 + mod) % mod; } } cout << ret << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...