#include<bits/stdc++.h> using namespace std; map<pair<int, int>, bool> M, Usun; queue<pair<int, int>> Q; int rozwiazanie() { int x, y; for(auto xd:M) { x=xd.first.first; y=xd.first.second; if((M.find({x-1, y})==M.end() && M.find({x+1, y})==M.end()) or (M.find({x, y-1})==M.end() && M.find({x, y+1})==M.end())) { Q.push({x, y}); } } int wyn=0, nx, ny; while(!Q.empty()) { x=Q.front().first; y=Q.front().second; Q.pop(); if(Usun.find({x, y})!=Usun.end()) { continue; } wyn++; Usun[{x, y}]=1; nx=x-1; ny=y; if(M.find({nx, ny})!=M.end() && Usun.find({nx, ny})==Usun.end()) { if(M.find({nx-1, ny})==M.end() or Usun.find({nx-1, ny})!=Usun.end()) { Q.push({nx, ny}); } } nx=x+1; ny=y; if(M.find({nx, ny})!=M.end() && Usun.find({nx, ny})==Usun.end()) { if(M.find({nx+1, ny})==M.end() or Usun.find({nx+1, ny})!=Usun.end()) { Q.push({nx, ny}); } } nx=x; ny=y-1; if(M.find({nx, ny})!=M.end() && Usun.find({nx, ny})==Usun.end()) { if(M.find({nx, ny-1})==M.end() or Usun.find({nx, ny-1})!=Usun.end()) { Q.push({nx, ny}); } } nx=x; ny=y+1; if(M.find({nx, ny})!=M.end() && Usun.find({nx, ny})==Usun.end()) { if(M.find({nx, ny+1})==M.end() or Usun.find({nx, ny+1})!=Usun.end()) { Q.push({nx, ny}); } } } Usun.clear(); return wyn; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m, k, q, x, y; cin >> n >> m >> k >> q; for(int i=1; i<=k; i++) { cin >> x >> y; M[{x, y}]=1; } cout << rozwiazanie() << '\n'; for(int i=1; i<=q; i++) { cin >> x >> y; if(M.find({x, y})==M.end()) { M[{x, y}]=1; } else { M.erase({x, y}); } cout << rozwiazanie() << '\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 | #include<bits/stdc++.h> using namespace std; map<pair<int, int>, bool> M, Usun; queue<pair<int, int>> Q; int rozwiazanie() { int x, y; for(auto xd:M) { x=xd.first.first; y=xd.first.second; if((M.find({x-1, y})==M.end() && M.find({x+1, y})==M.end()) or (M.find({x, y-1})==M.end() && M.find({x, y+1})==M.end())) { Q.push({x, y}); } } int wyn=0, nx, ny; while(!Q.empty()) { x=Q.front().first; y=Q.front().second; Q.pop(); if(Usun.find({x, y})!=Usun.end()) { continue; } wyn++; Usun[{x, y}]=1; nx=x-1; ny=y; if(M.find({nx, ny})!=M.end() && Usun.find({nx, ny})==Usun.end()) { if(M.find({nx-1, ny})==M.end() or Usun.find({nx-1, ny})!=Usun.end()) { Q.push({nx, ny}); } } nx=x+1; ny=y; if(M.find({nx, ny})!=M.end() && Usun.find({nx, ny})==Usun.end()) { if(M.find({nx+1, ny})==M.end() or Usun.find({nx+1, ny})!=Usun.end()) { Q.push({nx, ny}); } } nx=x; ny=y-1; if(M.find({nx, ny})!=M.end() && Usun.find({nx, ny})==Usun.end()) { if(M.find({nx, ny-1})==M.end() or Usun.find({nx, ny-1})!=Usun.end()) { Q.push({nx, ny}); } } nx=x; ny=y+1; if(M.find({nx, ny})!=M.end() && Usun.find({nx, ny})==Usun.end()) { if(M.find({nx, ny+1})==M.end() or Usun.find({nx, ny+1})!=Usun.end()) { Q.push({nx, ny}); } } } Usun.clear(); return wyn; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m, k, q, x, y; cin >> n >> m >> k >> q; for(int i=1; i<=k; i++) { cin >> x >> y; M[{x, y}]=1; } cout << rozwiazanie() << '\n'; for(int i=1; i<=q; i++) { cin >> x >> y; if(M.find({x, y})==M.end()) { M[{x, y}]=1; } else { M.erase({x, y}); } cout << rozwiazanie() << '\n'; } } |