#include <cstdint> #include <cstdio> #include <set> #include <vector> struct PairCompareX { bool operator()(const std::pair<int, int>& a, const std::pair<int, int>& b) const { return (a.first < b.first) || (a.first == b.first && a.second < b.second); } }; struct PairCompareY { bool operator()(const std::pair<int, int>& a, const std::pair<int, int>& b) const { return (a.second < b.second) || (a.second == b.second && a.first < b.first); } }; using Brick = std::pair<int, int>; using BoardX = std::set<Brick, PairCompareX>; using BoardY = std::set<Brick, PairCompareY>; bool sameX(const Brick& b1, const Brick& b2) { return b1.first == b2.first; } bool sameY(const Brick& b1, const Brick& b2) { return b1.second == b2.second; } bool nearX(const Brick& b1, const Brick& b2) { return b1.first + 1 == b2.first || b1.first == b2.first + 1; } bool nearY(const Brick& b1, const Brick& b2) { return b1.second + 1 == b2.second || b1.second == b2.second + 1; } int count(BoardX boardX, BoardY boardY) { int result = 0; bool removed = true; while (removed) { removed = false; for (auto it = boardX.begin(); it != boardX.end();) { auto itPrev = std::prev(it, 1); auto itNext = std::next(it, 1); if ((itPrev == boardX.end() || !sameX(*it, *itPrev) || !nearY(*it, *itPrev)) && (itNext == boardX.end() || !sameX(*it, *itNext) || !nearY(*it, *itNext))) { boardY.erase(*it); it = boardX.erase(it); result++; removed = true; } else { ++it; } } for (auto it = boardY.begin(); it != boardY.end();) { auto itPrev = std::prev(it, 1); auto itNext = std::next(it, 1); if ((itPrev == boardY.end() || !sameY(*it, *itPrev) || !nearX(*it, *itPrev)) && (itNext == boardY.end() || !sameY(*it, *itNext) || !nearX(*it, *itNext))) { boardX.erase(*it); it = boardY.erase(it); result++; removed = true; } else { ++it; } } } return result; } int main() { int n, m, k, q, x, y; scanf("%d %d %d %d", &n, &m, &k, &q); BoardX boardX; BoardY boardY; for (int i = 0; i < k; ++i) { scanf("%d %d", &x, &y); boardX.emplace(x, y); boardY.emplace(x, y); } printf("%d\n", count(boardX, boardY)); for (int i = 0; i < q; ++i) { scanf("%d %d", &x, &y); auto it = boardX.find({x, y}); if (it == boardX.end()) { boardX.emplace(x, y); boardY.emplace(x, y); } else { boardX.erase(it); boardY.erase({x, y}); } printf("%d\n", count(boardX, boardY)); } 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 | #include <cstdint> #include <cstdio> #include <set> #include <vector> struct PairCompareX { bool operator()(const std::pair<int, int>& a, const std::pair<int, int>& b) const { return (a.first < b.first) || (a.first == b.first && a.second < b.second); } }; struct PairCompareY { bool operator()(const std::pair<int, int>& a, const std::pair<int, int>& b) const { return (a.second < b.second) || (a.second == b.second && a.first < b.first); } }; using Brick = std::pair<int, int>; using BoardX = std::set<Brick, PairCompareX>; using BoardY = std::set<Brick, PairCompareY>; bool sameX(const Brick& b1, const Brick& b2) { return b1.first == b2.first; } bool sameY(const Brick& b1, const Brick& b2) { return b1.second == b2.second; } bool nearX(const Brick& b1, const Brick& b2) { return b1.first + 1 == b2.first || b1.first == b2.first + 1; } bool nearY(const Brick& b1, const Brick& b2) { return b1.second + 1 == b2.second || b1.second == b2.second + 1; } int count(BoardX boardX, BoardY boardY) { int result = 0; bool removed = true; while (removed) { removed = false; for (auto it = boardX.begin(); it != boardX.end();) { auto itPrev = std::prev(it, 1); auto itNext = std::next(it, 1); if ((itPrev == boardX.end() || !sameX(*it, *itPrev) || !nearY(*it, *itPrev)) && (itNext == boardX.end() || !sameX(*it, *itNext) || !nearY(*it, *itNext))) { boardY.erase(*it); it = boardX.erase(it); result++; removed = true; } else { ++it; } } for (auto it = boardY.begin(); it != boardY.end();) { auto itPrev = std::prev(it, 1); auto itNext = std::next(it, 1); if ((itPrev == boardY.end() || !sameY(*it, *itPrev) || !nearX(*it, *itPrev)) && (itNext == boardY.end() || !sameY(*it, *itNext) || !nearX(*it, *itNext))) { boardX.erase(*it); it = boardY.erase(it); result++; removed = true; } else { ++it; } } } return result; } int main() { int n, m, k, q, x, y; scanf("%d %d %d %d", &n, &m, &k, &q); BoardX boardX; BoardY boardY; for (int i = 0; i < k; ++i) { scanf("%d %d", &x, &y); boardX.emplace(x, y); boardY.emplace(x, y); } printf("%d\n", count(boardX, boardY)); for (int i = 0; i < q; ++i) { scanf("%d %d", &x, &y); auto it = boardX.find({x, y}); if (it == boardX.end()) { boardX.emplace(x, y); boardY.emplace(x, y); } else { boardX.erase(it); boardY.erase({x, y}); } printf("%d\n", count(boardX, boardY)); } return 0; } |