제출 #237473

#제출 시각아이디문제언어결과실행 시간메모리
237473IgorIPlus Minus (BOI17_plusminus)C++17
100 / 100
252 ms24440 KiB
const int LG = 21; const int FN = 400005; const long long MOD = 1e9 + 7; const long long INF = 1e9; const long long INFLL = 1e18; #include <bits/stdc++.h> using namespace std; #define int long long typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef vector<int> vi; typedef vector<ll> vll; #define forn(i, n) for (int (i) = 0; (i) != (n); (i)++) #define all(v) (v).begin(), (v).end() #define rall(v) (v).rbegin(), (v).rend() #define popcount(x) __builtin_popcount(x) #define popcountll(x) __builtin_popcountll(x) #define fi first #define se second #define re return #define pb push_back #define uniq(x) sort(all(x)); (x).resize(unique(all(x)) - (x).begin()) #ifdef LOCAL #define dbg(x) cerr << __LINE__ << " " << #x << " " << x << endl #define ln cerr << __LINE__ << endl #else #define dbg(x) void(0) #define ln void(0) #endif // LOCAL int cx[4] = {-1, 0, 1, 0}; int cy[4] = {0, -1, 0, 1}; string Yes[2] = {"No", "Yes"}; string YES[2] = {"NO", "YES"}; ll inq(ll x, ll y) { if (!y) re 1 % MOD; ll l = inq(x, y / 2); if (y % 2) re l * l % MOD * x % MOD; re l * l % MOD; } ll rev(ll x) { return inq(x, MOD - 2); } bool __precomputed_combinatorics = 0; vector<ll> __fact, __ufact, __rev; void __precompute_combinatorics() { __precomputed_combinatorics = 1; __fact.resize(FN); __ufact.resize(FN); __rev.resize(FN); __rev[1] = 1; for (int i = 2; i < FN; i++) __rev[i] = MOD - __rev[MOD % i] * (MOD / i) % MOD; __fact[0] = 1, __ufact[0] = 1; for (int i = 1; i < FN; i++) __fact[i] = __fact[i - 1] * i % MOD, __ufact[i] = __ufact[i - 1] * __rev[i] % MOD; } ll fact(int x) { if (!__precomputed_combinatorics) __precompute_combinatorics(); return __fact[x]; } ll cnk(int n, int k) { if (k < 0 || k > n) return 0; if (!__precomputed_combinatorics) __precompute_combinatorics(); return __fact[n] * __ufact[n - k] % MOD * __ufact[k] % MOD; } int Root(int x, vector<int> &root) { if (x == root[x]) return x; return root[x] = Root(root[x], root); } void Merge(int v, int u, vector<int> &root, vector<int> &sz) { v = Root(v, root), u = Root(u, root); if (v == u) return; if (sz[v] < sz[u]) { sz[u] += sz[v]; root[v] = u; } else { sz[v] += sz[u]; root[u] = v; } } int ok(int x, int n) { return 0 <= x && x < n; } void bfs(int v, vi &dist, vector<vi> &graph) { fill(all(dist), -1); dist[v] = 0; vi q = {v}; for (int i = 0; i < q.size(); i++) { for (auto u : graph[q[i]]) { if (dist[u] == -1) { dist[u] = dist[q[i]] + 1; q.push_back(u); } } } } ll log10(ll x) { if (x < 10) re 1; re 1 + log10(x / 10); } ll sqr(ll x) { return x * x; } signed main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, m, k; cin >> n >> m >> k; map<int, vector<pii> > rows, cols; set<int> aeven, aodd; forn(i, k) { char c; int x, y; cin >> c >> x >> y; x--, y--; if (c == '+') { rows[x].push_back({y, 1}); cols[y].push_back({x, 1}); if ((x + y) % 2 == 0) aeven.insert(1); else aodd.insert(1); } else { rows[x].push_back({y, -1}); cols[y].push_back({x, -1}); if ((x + y) % 2 == 0) aeven.insert(-1); else aodd.insert(-1); } } ll ans_row = 1; int cn = n; for (auto i : rows) { set<int> odd, even; for (auto it : i.second) { if (it.first % 2 == 0) even.insert(it.second); else odd.insert(it.second); } if (odd.size() == 1 && even.size() == 1) { int x = *odd.begin(), y = *even.begin(); if (x == y) ans_row = 0; } if (odd.size() == 2 || even.size() == 2) { ans_row = 0; } if (odd.size() == 0 && even.size() == 0) { ans_row = ans_row * 2 % MOD; } cn--; } ans_row = ans_row * inq(2, cn) % MOD; ll ans_coll = 1; int cm = m; for (auto i : cols) { set<int> odd, even; for (auto it : i.second) { if (it.first % 2 == 0) even.insert(it.second); else odd.insert(it.second); } if (odd.size() == 1 && even.size() == 1) { int x = *odd.begin(), y = *even.begin(); if (x == y) ans_coll = 0; } if (odd.size() == 2 || even.size() == 2) { ans_coll = 0; } if (odd.size() == 0 && even.size() == 0) { ans_coll = ans_coll * 2 % MOD; } cm--; } ans_coll = ans_coll * inq(2, cm) % MOD; ll ans = ans_coll + ans_row; int fl = 0; if (aeven.size() <= 1 && aodd.size() <= 1) { if (aeven.size() == 0 || aodd.size() == 0) fl = 1; else { int x = *aodd.begin(), y = *aeven.begin(); if (x != y) fl = 1; } } ans -= fl; if (k == 0 && fl == 1) ans -= fl; //cout << ans_coll << " " << ans_row << " " << fl << endl; cout << ((ans % MOD) + MOD) % MOD; } /* Note: Check constants at the beginning of the code. N is set to 4e5 but be careful in problems with large constant factor. Setting N in every problem is more effective. Check corner cases. N = 1 No def int long long for now. Add something here. */

컴파일 시 표준 에러 (stderr) 메시지

plusminus.cpp: In function 'void bfs(long long int, vi&, std::vector<std::vector<long long int> >&)':
plusminus.cpp:114:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < q.size(); i++)
                     ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...