제출 #670929

#제출 시각아이디문제언어결과실행 시간메모리
670929MakarooniPlus Minus (BOI17_plusminus)C++14
100 / 100
240 ms36852 KiB
/* IN THE NAME OF GOD */ /* |\/| /-\ |\| | |\/| /-\ */ #include "bits/stdc++.h" using namespace std; #define sz(x) (int)x.size() #define endl '\n' #define pb push_back #define all(x) x.begin(), x.end() #define F first #define S second #define mr make_pair //#define int long long #define pii pair<int, int> typedef long double ld; typedef long long ll; mt19937 rng (chrono::high_resolution_clock::now().time_since_epoch().count()); const int N = 2e5 + 10; const ll MOD = 1e9 + 7; const int inf = 1e9; const ll INF = 2e18; vector<int> h[N][2], w[N][2]; vector<int> vx, vy; int Q[N][3]; int pw(int a, int b){ if(b == 0) return 1; int p = pw(a, b / 2); p = (1LL * p * p) % MOD; if(b % 2) p = (1LL * p * a) % MOD; return p; } int fx(int x){ return lower_bound(all(vx), x) - vx.begin(); } int fy(int y){ return lower_bound(all(vy), y) - vy.begin(); } int32_t main(){ ios_base:: sync_with_stdio(0), cin.tie(0), cout.tie(0); int n, m, q; cin >> n >> m >> q; char s; int x, y; set<int> X, Y; for(int i = 1; i <= q; i++){ cin >> s >> x >> y; vx.pb(x); vy.pb(y); Q[i][0] = (s == '+'); Q[i][1] = x; Q[i][2] = y; } sort(all(vx)); sort(all(vy)); vx.resize(unique(all(vx)) - vx.begin()); vy.resize(unique(all(vy)) - vy.begin()); int t; for(int i = 1; i <= q; i++){ t = Q[i][0]; x = Q[i][1]; y = Q[i][2]; h[fx(x)][y % 2].pb(t); w[fy(y)][x % 2].pb(t); X.insert(x); Y.insert(y); } bool f = 1; for(int i = 0; i <= 100000; i++){ for(int j = 1; j < sz(h[i][0]); j++){ if(h[i][0][j] != h[i][0][j - 1]){ f = 0; break; } } if(!f) break; for(int j = 1; j < sz(h[i][1]); j++){ if(h[i][1][j] != h[i][1][j - 1]){ f = 0; break; } } if(!f) break; if(sz(h[i][0]) >= 1 && sz(h[i][1]) >= 1){ if(h[i][0][0] == h[i][1][0]){ f = 0; break; } } } bool f2 = 1; for(int i = 0; i <= 100000; i++){ for(int j = 1; j < sz(w[i][0]); j++){ if(w[i][0][j] != w[i][0][j - 1]){ f2 = 0; break; } } if(!f2) break; for(int j = 1; j < sz(w[i][1]); j++){ if(w[i][1][j] != w[i][1][j - 1]){ f2 = 0; break; } } if(!f2) break; if(sz(w[i][0]) >= 1 && sz(w[i][1]) >= 1){ if(w[i][0][0] == w[i][1][0]){ f2 = 0; break; } } } //cout << n << " " << sz(X) << endl; ll ans = 0; if(f) ans = pw(2, n - sz(X)); if(f2) ans += pw(2, m - sz(Y)); ans %= MOD; if(f && f2) ans--; if(q == 0) ans--; if(ans < 0) ans += MOD; cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...