#include <bits/stdc++.h>
using namespace std;
int wyn=0;
struct pkt
{
int x;
int y;
};
bool operator<(pkt a, pkt b)
{
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
map <pkt,int> oni,akt;
queue <pkt> kol;
int main()
{
cin.tie(0)->sync_with_stdio(0);
int n,m,k,q;
cin>>n>>m>>k>>q;
for(int i=0;i<k;i++)
{
pkt a;
cin>>a.x>>a.y;
oni[a]=0;
}
/*for(auto b:oni)
{
pkt a=b.first;
for(int i=-1;i<2;i++)
for(int j=-1;j<2;j++)
if((i!=0||j!=0)&&oni.find({a.x+i,a.y+j})!=oni.end()) oni[a]++;
}*/
int zw=0;
akt=oni;
//for(auto e:akt) cout<<e.second<<" ";
for(auto b:akt)
if(((akt.find({b.first.x+1,b.first.y})==akt.end())&&(akt.find({b.first.x-1,b.first.y})==akt.end()))||((akt.find({b.first.x,b.first.y+1})==akt.end())&&(akt.find({b.first.x,b.first.y-1})==akt.end())))
kol.push(b.first);
while(!kol.empty())
{
pkt a=kol.front();
//cout<<a.x<<" "<<a.y<<"a\n";
kol.pop();
if(akt.find(a)==akt.end()) continue;
zw++;
akt.erase(a);
for(int i=-1;i<2;i++)
for(int j=-1;j<2;j++)
{
//if((i!=0||j!=0)&&akt.find({a.x+i,a.y+j})!=akt.end()) akt[{a.x+i,a.y+j}]--;
pkt b={a.x+i,a.y+j};
if(akt.find(b)==akt.end()) continue;
if(((akt.find({b.x+1,b.y})==akt.end())&&(akt.find({b.x-1,b.y})==akt.end()))||((akt.find({b.x,b.y+1})==akt.end())&&(akt.find({b.x,b.y-1})==akt.end())))
kol.push(b);
}
}
cout<<zw<<"\n";
for(int i=0;i<q;i++)
{
pkt r;
cin>>r.x>>r.y;
if(oni.find(r)==oni.end()) oni[r]=0;
else oni.erase(r);
zw=0;
akt=oni;
//for(auto e:akt) cout<<e.second<<" ";
for(auto b:akt)
if(((akt.find({b.first.x+1,b.first.y})==akt.end())&&(akt.find({b.first.x-1,b.first.y})==akt.end()))||((akt.find({b.first.x,b.first.y+1})==akt.end())&&(akt.find({b.first.x,b.first.y-1})==akt.end())))
kol.push(b.first);
while(!kol.empty())
{
pkt a=kol.front();
//cout<<a.x<<" "<<a.y<<"a\n";
kol.pop();
if(akt.find(a)==akt.end()) continue;
zw++;
akt.erase(a);
for(int i=-1;i<2;i++)
for(int j=-1;j<2;j++)
{
//if((i!=0||j!=0)&&akt.find({a.x+i,a.y+j})!=akt.end()) akt[{a.x+i,a.y+j}]--;
pkt b={a.x+i,a.y+j};
if(akt.find(b)==akt.end()) continue;
if(((akt.find({b.x+1,b.y})==akt.end())&&(akt.find({b.x-1,b.y})==akt.end()))||((akt.find({b.x,b.y+1})==akt.end())&&(akt.find({b.x,b.y-1})==akt.end())))
kol.push(b);
}
}
cout<<zw<<"\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 82 83 84 85 86 87 88 89 90 91 | #include <bits/stdc++.h> using namespace std; int wyn=0; struct pkt { int x; int y; }; bool operator<(pkt a, pkt b) { if(a.x==b.x) return a.y<b.y; return a.x<b.x; } map <pkt,int> oni,akt; queue <pkt> kol; int main() { cin.tie(0)->sync_with_stdio(0); int n,m,k,q; cin>>n>>m>>k>>q; for(int i=0;i<k;i++) { pkt a; cin>>a.x>>a.y; oni[a]=0; } /*for(auto b:oni) { pkt a=b.first; for(int i=-1;i<2;i++) for(int j=-1;j<2;j++) if((i!=0||j!=0)&&oni.find({a.x+i,a.y+j})!=oni.end()) oni[a]++; }*/ int zw=0; akt=oni; //for(auto e:akt) cout<<e.second<<" "; for(auto b:akt) if(((akt.find({b.first.x+1,b.first.y})==akt.end())&&(akt.find({b.first.x-1,b.first.y})==akt.end()))||((akt.find({b.first.x,b.first.y+1})==akt.end())&&(akt.find({b.first.x,b.first.y-1})==akt.end()))) kol.push(b.first); while(!kol.empty()) { pkt a=kol.front(); //cout<<a.x<<" "<<a.y<<"a\n"; kol.pop(); if(akt.find(a)==akt.end()) continue; zw++; akt.erase(a); for(int i=-1;i<2;i++) for(int j=-1;j<2;j++) { //if((i!=0||j!=0)&&akt.find({a.x+i,a.y+j})!=akt.end()) akt[{a.x+i,a.y+j}]--; pkt b={a.x+i,a.y+j}; if(akt.find(b)==akt.end()) continue; if(((akt.find({b.x+1,b.y})==akt.end())&&(akt.find({b.x-1,b.y})==akt.end()))||((akt.find({b.x,b.y+1})==akt.end())&&(akt.find({b.x,b.y-1})==akt.end()))) kol.push(b); } } cout<<zw<<"\n"; for(int i=0;i<q;i++) { pkt r; cin>>r.x>>r.y; if(oni.find(r)==oni.end()) oni[r]=0; else oni.erase(r); zw=0; akt=oni; //for(auto e:akt) cout<<e.second<<" "; for(auto b:akt) if(((akt.find({b.first.x+1,b.first.y})==akt.end())&&(akt.find({b.first.x-1,b.first.y})==akt.end()))||((akt.find({b.first.x,b.first.y+1})==akt.end())&&(akt.find({b.first.x,b.first.y-1})==akt.end()))) kol.push(b.first); while(!kol.empty()) { pkt a=kol.front(); //cout<<a.x<<" "<<a.y<<"a\n"; kol.pop(); if(akt.find(a)==akt.end()) continue; zw++; akt.erase(a); for(int i=-1;i<2;i++) for(int j=-1;j<2;j++) { //if((i!=0||j!=0)&&akt.find({a.x+i,a.y+j})!=akt.end()) akt[{a.x+i,a.y+j}]--; pkt b={a.x+i,a.y+j}; if(akt.find(b)==akt.end()) continue; if(((akt.find({b.x+1,b.y})==akt.end())&&(akt.find({b.x-1,b.y})==akt.end()))||((akt.find({b.x,b.y+1})==akt.end())&&(akt.find({b.x,b.y-1})==akt.end()))) kol.push(b); } } cout<<zw<<"\n"; } } |
English