#include <bits/stdc++.h> using namespace std; typedef vector<int> VI; typedef pair <int,int> ii; typedef long long LL; #define pb push_back const int INF = 2147483647; const int N = 500005; int dx[4] = {-1, 0, 1, 0}; int dy[4] = {0, 1, 0, -1}; int vis[N], a, b, d, n, m, q, k, w, i, sas[N][4], act[N], x[N], y[N]; map<ii, int> mapa; bool checkSas(int a, int b) { return (a == -1 || vis[a]) && (b == -1 || vis[b]); } void tryAdd(int ind, queue<int>& q) { if (act[ind] && !vis[ind]) { if (checkSas(sas[ind][0], sas[ind][2]) || checkSas(sas[ind][1], sas[ind][3])) { q.push(ind); vis[ind] = 1; } } } int get() { int res = 0; queue<int> q; for (int i=0;i<d;i++) vis[i] = 0; for (int i=0;i<d;i++) tryAdd(i, q); while (!q.empty()) { int w = q.front(); q.pop(); res++; for (int i=0;i<4;i++) if (sas[w][i] != -1) tryAdd(sas[w][i], q); } return res; } void add(int a, int b) { x[d] = a; y[d] = b; mapa[ii(a, b)] = d; for (int j=0;j<4;j++) { int aa = a + dx[j]; int bb = b + dy[j]; if (mapa.find(ii(aa, bb)) != mapa.end()) { int w = mapa[ii(aa, bb)]; sas[d][j] = w; sas[w][(j + 2) % 4] = d; } else sas[d][j] = -1; } act[d] = 1; d++; } void remmm(int ind) { act[ind] = 0; for (int i=0;i<4;i++) if (sas[ind][i] != -1) sas[sas[ind][i]][(i + 2) % 4] = -1; mapa.erase(ii(x[ind], y[ind])); } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m >> k >> q; d = 0; for (i=0;i<k;i++) { cin >> a >> b; add(a, b); } cout << get() << endl; while (q--) { cin >> a >> b; if (mapa.find(ii(a, b)) != mapa.end()) w = mapa[ii(a, b)]; else w = d; if (w < d && !act[w]) w = d; if (w == d) add(a, b); else remmm(w); cout << get() << 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 | #include <bits/stdc++.h> using namespace std; typedef vector<int> VI; typedef pair <int,int> ii; typedef long long LL; #define pb push_back const int INF = 2147483647; const int N = 500005; int dx[4] = {-1, 0, 1, 0}; int dy[4] = {0, 1, 0, -1}; int vis[N], a, b, d, n, m, q, k, w, i, sas[N][4], act[N], x[N], y[N]; map<ii, int> mapa; bool checkSas(int a, int b) { return (a == -1 || vis[a]) && (b == -1 || vis[b]); } void tryAdd(int ind, queue<int>& q) { if (act[ind] && !vis[ind]) { if (checkSas(sas[ind][0], sas[ind][2]) || checkSas(sas[ind][1], sas[ind][3])) { q.push(ind); vis[ind] = 1; } } } int get() { int res = 0; queue<int> q; for (int i=0;i<d;i++) vis[i] = 0; for (int i=0;i<d;i++) tryAdd(i, q); while (!q.empty()) { int w = q.front(); q.pop(); res++; for (int i=0;i<4;i++) if (sas[w][i] != -1) tryAdd(sas[w][i], q); } return res; } void add(int a, int b) { x[d] = a; y[d] = b; mapa[ii(a, b)] = d; for (int j=0;j<4;j++) { int aa = a + dx[j]; int bb = b + dy[j]; if (mapa.find(ii(aa, bb)) != mapa.end()) { int w = mapa[ii(aa, bb)]; sas[d][j] = w; sas[w][(j + 2) % 4] = d; } else sas[d][j] = -1; } act[d] = 1; d++; } void remmm(int ind) { act[ind] = 0; for (int i=0;i<4;i++) if (sas[ind][i] != -1) sas[sas[ind][i]][(i + 2) % 4] = -1; mapa.erase(ii(x[ind], y[ind])); } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m >> k >> q; d = 0; for (i=0;i<k;i++) { cin >> a >> b; add(a, b); } cout << get() << endl; while (q--) { cin >> a >> b; if (mapa.find(ii(a, b)) != mapa.end()) w = mapa[ii(a, b)]; else w = d; if (w < d && !act[w]) w = d; if (w == d) add(a, b); else remmm(w); cout << get() << endl; } return 0; } |