Submission #1280296

#TimeUsernameProblemLanguageResultExecution timeMemory
1280296quangminh412Plus Minus (BOI17_plusminus)C++17
12 / 100
2 ms580 KiB
/* Ben Watson Quang Minh MasterDDDDD */ #include <bits/stdc++.h> using namespace std; #define ll long long const string name = "test"; void solve(); signed main() { if (fopen((name + ".inp").c_str(), "r")) { freopen((name + ".inp").c_str(), "r", stdin); freopen((name + ".out").c_str(), "w", stdout); } ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); solve(); return 0; } // main program const int maxk = 1e5 + 5; const int mod = 1e9 + 7; int mul(int a, int b) { return 1ll * a * b % mod; } int power(int a, int b) { int res = 1; for (; b != 0; b /= 2, a = mul(a, a)) if (b & 1) res = mul(res, a); return res; } bool cmpX(const array<int, 3>& a, const array<int, 3>& b) { if (a[1] != b[1]) return a[1] < b[1]; return a[2] < b[2]; } bool cmpY(const array<int, 3>& a, const array<int, 3>& b) { if (a[2] != b[2]) return a[2] < b[2]; return a[1] < b[1]; } vector<array<int, 3>> elecs; int n, m, k; int count_rows() { sort(elecs.begin(), elecs.end(), cmpX); int res = 0, prev = 0; for (int l = 0, r = -1; l < k; l = r + 1) { r++; while (r + 1 < k && elecs[r + 1][1] == elecs[r][1]) r++; for (int i = l; i <= r; i++) { int val1 = (elecs[i][2] ^ elecs[l][2]) & 1, val2 = (elecs[i][0] ^ elecs[l][0]); if (val1 != val2) return 0; } res += elecs[l][1] - prev - 1; prev = elecs[l][1]; } res += n - prev; return power(2, res); } int count_cols() { sort(elecs.begin(), elecs.end(), cmpY); int res = 0, prev = 0; for (int l = 0, r = -1; l < k; l = r + 1) { r++; while (r + 1 < k && elecs[r + 1][2] == elecs[r][2]) r++; for (int i = l; i <= r; i++) { int val1 = (elecs[i][1] ^ elecs[l][1]) & 1, val2 = (elecs[i][0] ^ elecs[l][0]); if (val1 != val2) return 0; } res += elecs[l][2] - prev - 1; prev = elecs[l][2]; } res += m - prev; return power(2, res); } int count_both() { for (int i = 0; i < k; i++) { int val1 = (elecs[i][1] ^ elecs[i][2] ^ elecs[0][1] ^ elecs[0][2]) & 1; int val2 = (elecs[i][0] ^ elecs[0][0]); if (val1 != val2) return 0; } return 1; } void solve() { cin >> n >> m >> k; for (int i = 0; i < k; i++) { char t; cin >> t; int sign = (t == '+' ? 1 : 0); int x, y; cin >> x >> y; elecs.push_back({sign, x, y}); } int val1 = count_rows(); int val2 = count_cols(); int exclude = count_both(); int res = (val1 + val2 - exclude + mod) % mod; if (k == 0) res = (res - 1 + mod) % mod; cout << res << '\n'; }

Compilation message (stderr)

plusminus.cpp: In function 'int main()':
plusminus.cpp:19:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   19 |         freopen((name + ".inp").c_str(), "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
plusminus.cpp:20:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   20 |         freopen((name + ".out").c_str(), "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...