#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; } } } |
English