#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; } |
English