#include<bits/stdc++.h> int n, m, k, q; const int dx[8] = {1, 1, 1, 0, 0, -1, -1, -1}; const int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1}; void SolveFast(){ std::map<std::pair<int, int>, int> mapka; std::map<std::pair<int, int>, int> is; int ans = 0; auto Check = [&](int x, int y)->void{ int f = 0; f |= mapka[{x, y + 1}] & mapka[{x + 1, y}] & mapka[{x + 1, y + 1}]; f |= mapka[{x, y - 1}] & mapka[{x + 1, y}] & mapka[{x + 1, y - 1}]; f |= mapka[{x, y + 1}] & mapka[{x - 1, y}] & mapka[{x - 1, y + 1}]; f |= mapka[{x, y - 1}] & mapka[{x - 1, y}] & mapka[{x - 1, y - 1}]; if(f && !is[{x, y}]) --ans; if(!f && is[{x, y}]) ++ans; is[{x, y}] = f; }; for(int i = 0;i < k;i++){ int x, y; std::cin >> x >> y; mapka[{x, y}] = 1; ++ans; Check(x, y); for(int d = 0;d < 8;d++){ int nx = x + dx[d]; int ny = y + dy[d]; if(mapka[{nx, ny}] == 1) Check(nx, ny); } } std::cout << ans << '\n'; for(int i = 0;i < q;i++){ int x, y; std::cin >> x >> y; if(mapka[{x, y}] == 1){ mapka[{x, y}] = 0; if(is[{x, y}] == 0) --ans; is[{x, y}] = 0; for(int d = 0;d < 8;d++){ int nx = x + dx[d]; int ny = y + dy[d]; if(mapka[{nx, ny}] == 1) Check(nx, ny); } } else { mapka[{x, y}] = 1; ++ans; Check(x, y); for(int d = 0;d < 8;d++){ int nx = x + dx[d]; int ny = y + dy[d]; if(mapka[{nx, ny}] == 1) Check(nx, ny); } } std::cout << ans << '\n'; } } int main(){ using namespace std; ios::sync_with_stdio(false), cin.tie(nullptr); cin >> n >> m >> k >> q; SolveFast(); 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 | #include<bits/stdc++.h> int n, m, k, q; const int dx[8] = {1, 1, 1, 0, 0, -1, -1, -1}; const int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1}; void SolveFast(){ std::map<std::pair<int, int>, int> mapka; std::map<std::pair<int, int>, int> is; int ans = 0; auto Check = [&](int x, int y)->void{ int f = 0; f |= mapka[{x, y + 1}] & mapka[{x + 1, y}] & mapka[{x + 1, y + 1}]; f |= mapka[{x, y - 1}] & mapka[{x + 1, y}] & mapka[{x + 1, y - 1}]; f |= mapka[{x, y + 1}] & mapka[{x - 1, y}] & mapka[{x - 1, y + 1}]; f |= mapka[{x, y - 1}] & mapka[{x - 1, y}] & mapka[{x - 1, y - 1}]; if(f && !is[{x, y}]) --ans; if(!f && is[{x, y}]) ++ans; is[{x, y}] = f; }; for(int i = 0;i < k;i++){ int x, y; std::cin >> x >> y; mapka[{x, y}] = 1; ++ans; Check(x, y); for(int d = 0;d < 8;d++){ int nx = x + dx[d]; int ny = y + dy[d]; if(mapka[{nx, ny}] == 1) Check(nx, ny); } } std::cout << ans << '\n'; for(int i = 0;i < q;i++){ int x, y; std::cin >> x >> y; if(mapka[{x, y}] == 1){ mapka[{x, y}] = 0; if(is[{x, y}] == 0) --ans; is[{x, y}] = 0; for(int d = 0;d < 8;d++){ int nx = x + dx[d]; int ny = y + dy[d]; if(mapka[{nx, ny}] == 1) Check(nx, ny); } } else { mapka[{x, y}] = 1; ++ans; Check(x, y); for(int d = 0;d < 8;d++){ int nx = x + dx[d]; int ny = y + dy[d]; if(mapka[{nx, ny}] == 1) Check(nx, ny); } } std::cout << ans << '\n'; } } int main(){ using namespace std; ios::sync_with_stdio(false), cin.tie(nullptr); cin >> n >> m >> k >> q; SolveFast(); return 0; } |