#include <bits/stdc++.h> using namespace std; int shiftx[4] = {1, -1, 0, 0}; int shifty[4] = {0, 0, 1, -1}; map<pair<int,int>, int>graph; multiset<pair<int,int>>ms; map<pair<int,int>, int>dp; map<pair<int,int>, int>vis; int c = 0; bool upd; void dpcalc(int x, int y){ int updown = 0, leftright = 0; dp[{x,y}] = 2; for(int i = 0; i < 4; ++i){ int dix = shiftx[i]+x, diy = shifty[i]+y; if(graph.find({dix,diy}) != graph.end()){ int dpx = dp[{dix,diy}]; if(dpx == 0){dpcalc(dix, diy); dpx = dp[{dix, diy}];} if(dpx == 1){ if(i < 2) ++updown; else ++leftright; } } else{ if(i < 2) ++updown; else ++leftright; } } if(updown == 2 or leftright == 2) { dp[{x,y}] = 1; if(upd) ++c; } } int pass; void dfs(int x, int y){ if(dp[{x,y}] == 1) --c; dp[{x,y}] = 0; vis[{x,y}] = pass; for(int i = 0; i < 4; ++i){ int dix = shiftx[i]+x; int diy = shifty[i]+y; if(graph.find({dix,diy}) != graph.end()){ if(vis[{dix,diy}] != pass) dfs(dix, diy); } } } int cans(){ int score = 0; for(pair<int,int>blocks : ms){ if(dp[{blocks.first,blocks.second}] == 0) dpcalc(blocks.first, blocks.second); if(dp[{blocks.first,blocks.second}] == 1) ++score; } return score; } int main(){ int n, m, k, q; cin >> n >> m >> k >> q; for(int i = 0; i < k; ++i){ int x, y; cin >> x >> y; graph[{x,y}] = 1; ms.insert({x,y}); } c = cans(); cout << c << endl; upd = true; while(q--){ ++pass; int x, y; cin >> x >> y; if(graph.find({x,y}) != graph.end()){ graph.erase({x,y}); ms.erase({x,y}); if(dp[{x,y}] == 1){ dp.erase({x,y}); --c; } for(int i = 0; i < 4; ++i){ int dix = shiftx[i]+x, diy = shifty[i]+y; if(graph.find({dix,diy}) != graph.end()){ if(vis[{dix,diy}] == pass) continue; dfs(dix, diy); dpcalc(dix,diy); } } cout << c << endl; } else{ ms.insert({x,y}); graph[{x,y}] = 1; dfs(x,y); dpcalc(x,y); cout << c << endl; } } }
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 | #include <bits/stdc++.h> using namespace std; int shiftx[4] = {1, -1, 0, 0}; int shifty[4] = {0, 0, 1, -1}; map<pair<int,int>, int>graph; multiset<pair<int,int>>ms; map<pair<int,int>, int>dp; map<pair<int,int>, int>vis; int c = 0; bool upd; void dpcalc(int x, int y){ int updown = 0, leftright = 0; dp[{x,y}] = 2; for(int i = 0; i < 4; ++i){ int dix = shiftx[i]+x, diy = shifty[i]+y; if(graph.find({dix,diy}) != graph.end()){ int dpx = dp[{dix,diy}]; if(dpx == 0){dpcalc(dix, diy); dpx = dp[{dix, diy}];} if(dpx == 1){ if(i < 2) ++updown; else ++leftright; } } else{ if(i < 2) ++updown; else ++leftright; } } if(updown == 2 or leftright == 2) { dp[{x,y}] = 1; if(upd) ++c; } } int pass; void dfs(int x, int y){ if(dp[{x,y}] == 1) --c; dp[{x,y}] = 0; vis[{x,y}] = pass; for(int i = 0; i < 4; ++i){ int dix = shiftx[i]+x; int diy = shifty[i]+y; if(graph.find({dix,diy}) != graph.end()){ if(vis[{dix,diy}] != pass) dfs(dix, diy); } } } int cans(){ int score = 0; for(pair<int,int>blocks : ms){ if(dp[{blocks.first,blocks.second}] == 0) dpcalc(blocks.first, blocks.second); if(dp[{blocks.first,blocks.second}] == 1) ++score; } return score; } int main(){ int n, m, k, q; cin >> n >> m >> k >> q; for(int i = 0; i < k; ++i){ int x, y; cin >> x >> y; graph[{x,y}] = 1; ms.insert({x,y}); } c = cans(); cout << c << endl; upd = true; while(q--){ ++pass; int x, y; cin >> x >> y; if(graph.find({x,y}) != graph.end()){ graph.erase({x,y}); ms.erase({x,y}); if(dp[{x,y}] == 1){ dp.erase({x,y}); --c; } for(int i = 0; i < 4; ++i){ int dix = shiftx[i]+x, diy = shifty[i]+y; if(graph.find({dix,diy}) != graph.end()){ if(vis[{dix,diy}] == pass) continue; dfs(dix, diy); dpcalc(dix,diy); } } cout << c << endl; } else{ ms.insert({x,y}); graph[{x,y}] = 1; dfs(x,y); dpcalc(x,y); cout << c << endl; } } } |