#include<bits/stdc++.h>
using namespace std;
int ans;
map<pair<int, int>, int> all_nodes;
map<pair<int, int>, int> update;
bool check(int a, int b, int moment = 0){
if(all_nodes.find({a, b}) == all_nodes.end()){
return true;
}
if(all_nodes[{a, b}] == 0 and moment <= update[{a, b}]){
return true;
}
if(all_nodes[{a, b}] == 1 and moment <= update[{a, b}]){
return false;
}
update[{a, b}] = moment;
bool zero = false;
if(all_nodes[{a, b}] == 0){
zero = true;
ans--;
}
all_nodes[{a, b}] = 1;
if(check(a+1, b, moment) and check(a-1, b, moment)){
if(all_nodes[{a, b}] == 1){
ans++;
}
check(a, b+1, moment);
check(a, b-1, moment);
all_nodes[{a, b}] = 0;
update[{a, b}] = moment;
return true;
}
if(check(a, b+1, moment) and check(a, b-1, moment)){
if(all_nodes[{a, b}] == 1){
ans++;
}
check(a+1, b, moment);
check(a-1, b, moment);
all_nodes[{a, b}] = 0;
update[{a, b}] = moment;
return true;
}
if(zero){
check(a+1, b, moment);
check(a-1, b, moment);
check(a, b+1, moment);
check(a, b-1, moment);
}
// if(all_nodes[{a, b}] == 0){
// ans--;
// }
all_nodes[{a, b}] = 1;
update[{a, b}] = moment;
return false;
}
int main(){
int n_board, m_board;
cin >> n_board >> m_board;
int q;
int n;
cin >> n >> q;
ans = 0;
//ans = n;
vector<pair<int, int>> repeat;
for(int i = 0; i < n; i++){
int a, b;
cin >> a >> b;
repeat.push_back({a, b});
all_nodes[{a, b}] = 1;
update[{a, b}] = -1;
}
for(auto [a, b]: repeat){
check(a, b);
}
cout << ans << '\n';
for(int t = 1; t <= q; t++){
int a, b;
cin >> a >> b;
if(all_nodes.find({a, b}) == all_nodes.end()){
all_nodes[{a, b}] = 1;
update[{a, b}] = -1;
check(a, b, t);
}else{
if(all_nodes[{a, b}] == 0){
ans--;
}
all_nodes.erase({a, b});
update.erase({a, b});
check(a+1, b, t);
check(a-1, b, t);
check(a, b+1, t);
check(a, b-1, t);
}
cout << ans << '\n';
}
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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #include<bits/stdc++.h> using namespace std; int ans; map<pair<int, int>, int> all_nodes; map<pair<int, int>, int> update; bool check(int a, int b, int moment = 0){ if(all_nodes.find({a, b}) == all_nodes.end()){ return true; } if(all_nodes[{a, b}] == 0 and moment <= update[{a, b}]){ return true; } if(all_nodes[{a, b}] == 1 and moment <= update[{a, b}]){ return false; } update[{a, b}] = moment; bool zero = false; if(all_nodes[{a, b}] == 0){ zero = true; ans--; } all_nodes[{a, b}] = 1; if(check(a+1, b, moment) and check(a-1, b, moment)){ if(all_nodes[{a, b}] == 1){ ans++; } check(a, b+1, moment); check(a, b-1, moment); all_nodes[{a, b}] = 0; update[{a, b}] = moment; return true; } if(check(a, b+1, moment) and check(a, b-1, moment)){ if(all_nodes[{a, b}] == 1){ ans++; } check(a+1, b, moment); check(a-1, b, moment); all_nodes[{a, b}] = 0; update[{a, b}] = moment; return true; } if(zero){ check(a+1, b, moment); check(a-1, b, moment); check(a, b+1, moment); check(a, b-1, moment); } // if(all_nodes[{a, b}] == 0){ // ans--; // } all_nodes[{a, b}] = 1; update[{a, b}] = moment; return false; } int main(){ int n_board, m_board; cin >> n_board >> m_board; int q; int n; cin >> n >> q; ans = 0; //ans = n; vector<pair<int, int>> repeat; for(int i = 0; i < n; i++){ int a, b; cin >> a >> b; repeat.push_back({a, b}); all_nodes[{a, b}] = 1; update[{a, b}] = -1; } for(auto [a, b]: repeat){ check(a, b); } cout << ans << '\n'; for(int t = 1; t <= q; t++){ int a, b; cin >> a >> b; if(all_nodes.find({a, b}) == all_nodes.end()){ all_nodes[{a, b}] = 1; update[{a, b}] = -1; check(a, b, t); }else{ if(all_nodes[{a, b}] == 0){ ans--; } all_nodes.erase({a, b}); update.erase({a, b}); check(a+1, b, t); check(a-1, b, t); check(a, b+1, t); check(a, b-1, t); } cout << ans << '\n'; } return 0; } |
English