#include <bits/stdc++.h>
using namespace std;
set<pair<int, int>> bricksList;
unordered_map<int, bool> bricksAt[210001];
unordered_map<int, int> active[210001];
int n, m, k, q;
int number = 0;
int offset = 1000;
// bool checkSolid(int x, int y)
// {
// if (bricksAt[x + 1][y] && bricksAt[x + 1][y + 1] && bricksAt[x][y + 1]) return true;
// if (bricksAt[x + 1][y] && bricksAt[x + 1][y - 1] && bricksAt[x][y - 1]) return true;
// if (bricksAt[x - 1][y] && bricksAt[x - 1][y + 1] && bricksAt[x][y + 1]) return true;
// if (bricksAt[x - 1][y] && bricksAt[x - 1][y - 1] && bricksAt[x][y - 1]) return true;
// return false;
// }
bool canTake(int x, int y)
{
if (!active[x + 1][y] && !active[x - 1][y]) return true;
if (!active[x][y + 1] && !active[x][y - 1]) return true;
return false;
}
void dfs(int x, int y)
{
if (!bricksAt[x][y]) return;
if (canTake(x, y))
{
active[x][y] = false;
++number;
if (active[x + 1][y])
dfs(x + 1, y);
if (active[x - 1][y])
dfs(x - 1, y);
if (active[x][y + 1])
dfs(x, y + 1);
if (active[x][y - 1])
dfs(x, y - 1);
}
}
void put(int x, int y)
{
bricksAt[x][y] = true;
active[x][y] = true;
bricksList.emplace(x, y);
// ++number;
// dfs(x, y);
}
void remove(int x, int y)
{
bricksAt[x][y] = false;
active[x][y] = false;
bricksList.erase(make_pair(x, y));
// dfs(x + 1, y);
// dfs(x - 1, y);
// dfs(x, y + 1);
// dfs(x, y - 1);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m >> k >> q;
for (int i = 0; i < k; ++i)
{
int x, y;
cin >> x >> y;
x += offset; y += offset;
bricksAt[x][y] = true;
active[x][y] = true;
bricksList.emplace(x, y);
}
for (auto [x, y] : bricksList)
{
if (active[x][y])
dfs(x, y);
}
cout << number << '\n';
for (int i = 0; i < q; ++i)
{
int x, y;
cin >> x >> y;
x += offset; y += offset;
if (bricksAt[x][y])
{
remove(x, y);
}
else
{
put(x, y);
}
number = 0;
for (auto [x, y] : bricksList)
{
if (bricksAt[x][y])
active[x][y] = true;
}
for (auto [x, y] : bricksList)
{
if (active[x][y])
dfs(x, y);
}
cout << number << '\n';
}
}
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 | #include <bits/stdc++.h> using namespace std; set<pair<int, int>> bricksList; unordered_map<int, bool> bricksAt[210001]; unordered_map<int, int> active[210001]; int n, m, k, q; int number = 0; int offset = 1000; // bool checkSolid(int x, int y) // { // if (bricksAt[x + 1][y] && bricksAt[x + 1][y + 1] && bricksAt[x][y + 1]) return true; // if (bricksAt[x + 1][y] && bricksAt[x + 1][y - 1] && bricksAt[x][y - 1]) return true; // if (bricksAt[x - 1][y] && bricksAt[x - 1][y + 1] && bricksAt[x][y + 1]) return true; // if (bricksAt[x - 1][y] && bricksAt[x - 1][y - 1] && bricksAt[x][y - 1]) return true; // return false; // } bool canTake(int x, int y) { if (!active[x + 1][y] && !active[x - 1][y]) return true; if (!active[x][y + 1] && !active[x][y - 1]) return true; return false; } void dfs(int x, int y) { if (!bricksAt[x][y]) return; if (canTake(x, y)) { active[x][y] = false; ++number; if (active[x + 1][y]) dfs(x + 1, y); if (active[x - 1][y]) dfs(x - 1, y); if (active[x][y + 1]) dfs(x, y + 1); if (active[x][y - 1]) dfs(x, y - 1); } } void put(int x, int y) { bricksAt[x][y] = true; active[x][y] = true; bricksList.emplace(x, y); // ++number; // dfs(x, y); } void remove(int x, int y) { bricksAt[x][y] = false; active[x][y] = false; bricksList.erase(make_pair(x, y)); // dfs(x + 1, y); // dfs(x - 1, y); // dfs(x, y + 1); // dfs(x, y - 1); } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> n >> m >> k >> q; for (int i = 0; i < k; ++i) { int x, y; cin >> x >> y; x += offset; y += offset; bricksAt[x][y] = true; active[x][y] = true; bricksList.emplace(x, y); } for (auto [x, y] : bricksList) { if (active[x][y]) dfs(x, y); } cout << number << '\n'; for (int i = 0; i < q; ++i) { int x, y; cin >> x >> y; x += offset; y += offset; if (bricksAt[x][y]) { remove(x, y); } else { put(x, y); } number = 0; for (auto [x, y] : bricksList) { if (bricksAt[x][y]) active[x][y] = true; } for (auto [x, y] : bricksList) { if (active[x][y]) dfs(x, y); } cout << number << '\n'; } } |
English