#include<iostream>
#include<vector>
using namespace std;
struct Address
{
int x;
int y;
};
vector<vector<bool>> FillTable(vector<vector<bool>> table, vector<Address> adds)
{
for(int i=0;i<adds.size();i++)
{
table[adds[i].x][adds[i].y]=1;
}
return table;
}
vector<vector<bool>> FillEmptyTable(vector<vector<bool>> table, int n, int m)
{
for(int i=0;i<=n+1;i++)
{
vector<bool> row;
for(int j=0;j<=m+1;j++)
{
row.push_back(0);
}
table.push_back(row);
}
return table;
}
int CountPieces(vector<vector<bool>> table, int pieces, vector<Address> add)
{
vector<vector<bool>> nextTable=table;
vector<Address> nextAdds;
bool changed = 0;
for(int i=0;i<add.size();i++)
{
if(table[add[i].x][add[i].y]==1)
{
if((table[add[i].x-1][add[i].y]==0&&table[add[i].x+1][add[i].y]==0)||(table[add[i].x][add[i].y-1]==0&&table[add[i].x][add[i].y+1]==0))
{
nextTable[add[i].x][add[i].y]=0;
pieces++;
changed=1;
}
else nextAdds.push_back(add[i]);
}
}
if(changed==0||nextAdds.size()==0) return pieces;
else return(CountPieces(nextTable,pieces,nextAdds));
}
vector<Address> GetAddresses(int k)
{
vector<Address> addresses;
for(int i=0;i<k;i++)
{
Address add;
cin>>add.x>>add.y;
addresses.push_back(add);
}
return addresses;
}
vector<Address> removeAdd(vector<Address> adds, Address add)
{
vector<Address> newAdd;
for(int i=0;i<adds.size();i++)
{
if(adds[i].x!=add.x||adds[i].y!=add.y)
{
newAdd.push_back(adds[i]);
}
}
return newAdd;
}
int main()
{
vector<vector<bool>> table;
vector<Address> addresses;
int n,m,k,q;
cin>>n>>m>>k>>q;
table=FillEmptyTable(table,n,m);
addresses=GetAddresses(k);
table=FillTable(table,addresses);
cout<<CountPieces(table,0,addresses)<<endl;
for(int i=0;i<q;i++)
{
int x,y;
cin>>x>>y;
if(table[x][y]==1)
{
table[x][y]=0;
Address add;
add.x=x;
add.y=y;
addresses=removeAdd(addresses,add);
}
else
{
table[x][y]=1;
Address add;
add.x=x;
add.y=y;
addresses.push_back(add);
}
cout<<CountPieces(table,0,addresses)<<endl;
}
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 110 111 112 113 114 115 116 117 | #include<iostream> #include<vector> using namespace std; struct Address { int x; int y; }; vector<vector<bool>> FillTable(vector<vector<bool>> table, vector<Address> adds) { for(int i=0;i<adds.size();i++) { table[adds[i].x][adds[i].y]=1; } return table; } vector<vector<bool>> FillEmptyTable(vector<vector<bool>> table, int n, int m) { for(int i=0;i<=n+1;i++) { vector<bool> row; for(int j=0;j<=m+1;j++) { row.push_back(0); } table.push_back(row); } return table; } int CountPieces(vector<vector<bool>> table, int pieces, vector<Address> add) { vector<vector<bool>> nextTable=table; vector<Address> nextAdds; bool changed = 0; for(int i=0;i<add.size();i++) { if(table[add[i].x][add[i].y]==1) { if((table[add[i].x-1][add[i].y]==0&&table[add[i].x+1][add[i].y]==0)||(table[add[i].x][add[i].y-1]==0&&table[add[i].x][add[i].y+1]==0)) { nextTable[add[i].x][add[i].y]=0; pieces++; changed=1; } else nextAdds.push_back(add[i]); } } if(changed==0||nextAdds.size()==0) return pieces; else return(CountPieces(nextTable,pieces,nextAdds)); } vector<Address> GetAddresses(int k) { vector<Address> addresses; for(int i=0;i<k;i++) { Address add; cin>>add.x>>add.y; addresses.push_back(add); } return addresses; } vector<Address> removeAdd(vector<Address> adds, Address add) { vector<Address> newAdd; for(int i=0;i<adds.size();i++) { if(adds[i].x!=add.x||adds[i].y!=add.y) { newAdd.push_back(adds[i]); } } return newAdd; } int main() { vector<vector<bool>> table; vector<Address> addresses; int n,m,k,q; cin>>n>>m>>k>>q; table=FillEmptyTable(table,n,m); addresses=GetAddresses(k); table=FillTable(table,addresses); cout<<CountPieces(table,0,addresses)<<endl; for(int i=0;i<q;i++) { int x,y; cin>>x>>y; if(table[x][y]==1) { table[x][y]=0; Address add; add.x=x; add.y=y; addresses=removeAdd(addresses,add); } else { table[x][y]=1; Address add; add.x=x; add.y=y; addresses.push_back(add); } cout<<CountPieces(table,0,addresses)<<endl; } return 0; } |
English