#include <cstdio>
#include <map>
#include <queue>
#include <utility>
#include <vector>
using namespace std;
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n) FOR(i,0,n)
#define VAR(v,w) __typeof(w) v=(w)
#define FORE(it,c) for(VAR(it,(c).begin());it!=(c).end();++it)
#define SIZE(c) ((int)(c).size())
#define MP make_pair
#define FT first
#define SD second
#define INT(x) int x; scanf("%d", &x)
typedef pair<int,int> PII;
typedef vector<bool> VB;
const int DX[4] = {1, 0, -1, 0}, DY[4] = {0, 1, 0, -1};
map<PII, VB> b;
int go() {
map<PII, VB> c = b;
queue<PII> q;
FORE(it,c) if (!it->SD[0] && !it->SD[2] || !it->SD[1] && !it->SD[3])
q.push(it->FT);
while (!q.empty()) {
VAR(it,c.find(q.front()));
q.pop();
if (it == c.end()) continue;
REP(k,4) if (it->SD[k]) {
VAR(jt,c.find(MP(it->FT.FT + DX[k], it->FT.SD + DY[k])));
if (jt == c.end()) continue;
jt->SD[k ^ 2] = 0;
if (!jt->SD[0] && !jt->SD[2] || !jt->SD[1] && !jt->SD[3]) q.push(jt->FT);
}
c.erase(it);
}
return SIZE(b) - SIZE(c);
}
int main() {
INT(n);
INT(m);
INT(k);
INT(q);
REP(kk,k) {
INT(x);
INT(y);
b[MP(x, y)].resize(4);
}
FORE(it,b) REP(k,4) it->SD[k] = b.find(MP(it->FT.FT + DX[k], it->FT.SD + DY[k])) != b.end();
printf("%d\n", go());
REP(qq,q) {
INT(x);
INT(y);
VAR(it,b.find(MP(x, y)));
if (it != b.end()) {
REP(k,4) if (it->SD[k]) b.find(MP(x + DX[k], y + DY[k]))->SD[k ^ 2] = 0;
b.erase(it);
} else {
VB& d = b[MP(x, y)];
d.resize(4);
REP(k,4) {
VAR(jt,b.find(MP(x + DX[k], y + DY[k])));
d[k] = jt != b.end();
if (d[k]) jt->SD[k ^ 2] = 1;
}
}
printf("%d\n", go());
}
}
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 | #include <cstdio> #include <map> #include <queue> #include <utility> #include <vector> using namespace std; #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define REP(i,n) FOR(i,0,n) #define VAR(v,w) __typeof(w) v=(w) #define FORE(it,c) for(VAR(it,(c).begin());it!=(c).end();++it) #define SIZE(c) ((int)(c).size()) #define MP make_pair #define FT first #define SD second #define INT(x) int x; scanf("%d", &x) typedef pair<int,int> PII; typedef vector<bool> VB; const int DX[4] = {1, 0, -1, 0}, DY[4] = {0, 1, 0, -1}; map<PII, VB> b; int go() { map<PII, VB> c = b; queue<PII> q; FORE(it,c) if (!it->SD[0] && !it->SD[2] || !it->SD[1] && !it->SD[3]) q.push(it->FT); while (!q.empty()) { VAR(it,c.find(q.front())); q.pop(); if (it == c.end()) continue; REP(k,4) if (it->SD[k]) { VAR(jt,c.find(MP(it->FT.FT + DX[k], it->FT.SD + DY[k]))); if (jt == c.end()) continue; jt->SD[k ^ 2] = 0; if (!jt->SD[0] && !jt->SD[2] || !jt->SD[1] && !jt->SD[3]) q.push(jt->FT); } c.erase(it); } return SIZE(b) - SIZE(c); } int main() { INT(n); INT(m); INT(k); INT(q); REP(kk,k) { INT(x); INT(y); b[MP(x, y)].resize(4); } FORE(it,b) REP(k,4) it->SD[k] = b.find(MP(it->FT.FT + DX[k], it->FT.SD + DY[k])) != b.end(); printf("%d\n", go()); REP(qq,q) { INT(x); INT(y); VAR(it,b.find(MP(x, y))); if (it != b.end()) { REP(k,4) if (it->SD[k]) b.find(MP(x + DX[k], y + DY[k]))->SD[k ^ 2] = 0; b.erase(it); } else { VB& d = b[MP(x, y)]; d.resize(4); REP(k,4) { VAR(jt,b.find(MP(x + DX[k], y + DY[k]))); d[k] = jt != b.end(); if (d[k]) jt->SD[k ^ 2] = 1; } } printf("%d\n", go()); } } |
English