#include <bits/stdc++.h> using namespace std; struct hashm { size_t operator()(const pair<int, int>& para) const { return (para.first * 2137) ^ (para.second); } }; unordered_set<pair<int, int>, hashm> klocki; unordered_map<pair<int, int>, bool, hashm> odw; unordered_map<pair<int, int>, pair<int, int>, hashm> sasi; int odp = 0; void zacznij(pair<int, int> start) { queue<pair<int, int>> q; q.push(start); odw[start] = true; while (!q.empty()) { auto cur = q.front(); q.pop(); odp++; pair<int, int> nowy = { cur.first - 1, cur.second }; if (klocki.find(nowy) != klocki.end()) { sasi[nowy].first--; if (sasi[nowy].first == 0 && !odw[nowy]) { odw[nowy] = true; q.push(nowy); } } nowy = { cur.first + 1, cur.second }; if (klocki.find(nowy) != klocki.end()) { sasi[nowy].first--; if (sasi[nowy].first == 0 && !odw[nowy]) { odw[nowy] = true; q.push(nowy); } } nowy = { cur.first, cur.second - 1 }; if (klocki.find(nowy) != klocki.end()) { sasi[nowy].second--; if (sasi[nowy].second == 0 && !odw[nowy]) { odw[nowy] = true; q.push(nowy); } } nowy = { cur.first, cur.second + 1 }; if (klocki.find(nowy) != klocki.end()) { sasi[nowy].second--; if (sasi[nowy].second == 0 && !odw[nowy]) { odw[nowy] = true; q.push(nowy); } } } } int policz() { odp = 0; odw.clear(); sasi.clear(); for (auto& p : klocki) { odw[p] = false; } for (auto& kl : klocki) { int x = kl.first, y = kl.second; pair<int, int> nowy; nowy = { x - 1, y }; if (klocki.find(nowy) != klocki.end()) { sasi[nowy].first++; } nowy = { x + 1, y }; if (klocki.find(nowy) != klocki.end()) { sasi[nowy].first++; } nowy = { x, y - 1 }; if (klocki.find(nowy) != klocki.end()) { sasi[nowy].second++; } nowy = { x, y + 1 }; if (klocki.find(nowy) != klocki.end()) { sasi[nowy].second++; } } for (auto& x : klocki) { if (!odw[x] && (sasi[x].first == 0 || sasi[x].second == 0)) { zacznij(x); } } return odp; } int main() { ios::sync_with_stdio(0); cin.tie(0); int n, m, k, q; cin >> n >> m >> k >> q; for (int i = 0; i < k; i++) { int x, y; cin >> x >> y; klocki.insert({ x, y }); } policz(); cout << odp << endl; while (q--) { int x, y; cin >> x >> y; if (klocki.find({ x, y }) == klocki.end()) { klocki.insert({ x, y }); } else { klocki.erase({ x, y }); } policz(); cout << odp << endl; } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | #include <bits/stdc++.h> using namespace std; struct hashm { size_t operator()(const pair<int, int>& para) const { return (para.first * 2137) ^ (para.second); } }; unordered_set<pair<int, int>, hashm> klocki; unordered_map<pair<int, int>, bool, hashm> odw; unordered_map<pair<int, int>, pair<int, int>, hashm> sasi; int odp = 0; void zacznij(pair<int, int> start) { queue<pair<int, int>> q; q.push(start); odw[start] = true; while (!q.empty()) { auto cur = q.front(); q.pop(); odp++; pair<int, int> nowy = { cur.first - 1, cur.second }; if (klocki.find(nowy) != klocki.end()) { sasi[nowy].first--; if (sasi[nowy].first == 0 && !odw[nowy]) { odw[nowy] = true; q.push(nowy); } } nowy = { cur.first + 1, cur.second }; if (klocki.find(nowy) != klocki.end()) { sasi[nowy].first--; if (sasi[nowy].first == 0 && !odw[nowy]) { odw[nowy] = true; q.push(nowy); } } nowy = { cur.first, cur.second - 1 }; if (klocki.find(nowy) != klocki.end()) { sasi[nowy].second--; if (sasi[nowy].second == 0 && !odw[nowy]) { odw[nowy] = true; q.push(nowy); } } nowy = { cur.first, cur.second + 1 }; if (klocki.find(nowy) != klocki.end()) { sasi[nowy].second--; if (sasi[nowy].second == 0 && !odw[nowy]) { odw[nowy] = true; q.push(nowy); } } } } int policz() { odp = 0; odw.clear(); sasi.clear(); for (auto& p : klocki) { odw[p] = false; } for (auto& kl : klocki) { int x = kl.first, y = kl.second; pair<int, int> nowy; nowy = { x - 1, y }; if (klocki.find(nowy) != klocki.end()) { sasi[nowy].first++; } nowy = { x + 1, y }; if (klocki.find(nowy) != klocki.end()) { sasi[nowy].first++; } nowy = { x, y - 1 }; if (klocki.find(nowy) != klocki.end()) { sasi[nowy].second++; } nowy = { x, y + 1 }; if (klocki.find(nowy) != klocki.end()) { sasi[nowy].second++; } } for (auto& x : klocki) { if (!odw[x] && (sasi[x].first == 0 || sasi[x].second == 0)) { zacznij(x); } } return odp; } int main() { ios::sync_with_stdio(0); cin.tie(0); int n, m, k, q; cin >> n >> m >> k >> q; for (int i = 0; i < k; i++) { int x, y; cin >> x >> y; klocki.insert({ x, y }); } policz(); cout << odp << endl; while (q--) { int x, y; cin >> x >> y; if (klocki.find({ x, y }) == klocki.end()) { klocki.insert({ x, y }); } else { klocki.erase({ x, y }); } policz(); cout << odp << endl; } return 0; } |