#include <cstdio> #include <utility> #include <set> #include <vector> #include <algorithm> #define REP(a, n) for (int a = 0; a < (n); ++a) #define FOR(a, b, c) for (int a = (b); a <= (c); ++a) #define INF 1000000000 typedef long long LL; using namespace std; ////////////////////// int N; int best; set<int> granice; vector<pair<int, int>> otwarte; void czysc_do(int x1) { while (*next(granice.begin()) <= x1) { int xa = *granice.begin(); int xb = *next(granice.begin()); int len = xb - xa; if (otwarte.back().first == xb) { len += otwarte.back().second; otwarte.pop_back(); } best = max(best, len); granice.erase(xa); } int xa = *granice.begin(); int xb = *next(granice.begin()); int add = x1 - xa; if (otwarte.back().first == xb) otwarte.back().second += add; else otwarte.emplace_back(xb, add); granice.erase(xa); } int solve(pair<int, int> *tab, int XS) { REP(a, N) if (tab[a].first > tab[a].second) swap(tab[a].first, tab[a].second); tab[N++] = make_pair(XS - 1, XS - 1); sort(tab, tab + N); granice.clear(); granice.insert(0); granice.insert(XS); otwarte.clear(); otwarte.emplace_back(XS, 0); best = 0; REP(a, N) { int x1 = tab[a].first; int x2 = tab[a].second; czysc_do(x1); granice.insert(x1); while (otwarte.back().first <= x2) { best = max(best, otwarte.back().second); otwarte.pop_back(); } granice.insert(x2); } best = max(best, otwarte.back().second + 1); // zewnętrzny return best; } pair<int, int> tabx[500001], taby[500001]; int main() { int XS, YS; scanf("%d%d%d", &N, &XS, &YS); REP(a, N) scanf("%d%d%d%d", &tabx[a].first, &taby[a].first, &tabx[a].second, &taby[a].second); LL res = solve(tabx, XS); res *= solve(taby, YS); printf("%lld\n", res); }
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 | #include <cstdio> #include <utility> #include <set> #include <vector> #include <algorithm> #define REP(a, n) for (int a = 0; a < (n); ++a) #define FOR(a, b, c) for (int a = (b); a <= (c); ++a) #define INF 1000000000 typedef long long LL; using namespace std; ////////////////////// int N; int best; set<int> granice; vector<pair<int, int>> otwarte; void czysc_do(int x1) { while (*next(granice.begin()) <= x1) { int xa = *granice.begin(); int xb = *next(granice.begin()); int len = xb - xa; if (otwarte.back().first == xb) { len += otwarte.back().second; otwarte.pop_back(); } best = max(best, len); granice.erase(xa); } int xa = *granice.begin(); int xb = *next(granice.begin()); int add = x1 - xa; if (otwarte.back().first == xb) otwarte.back().second += add; else otwarte.emplace_back(xb, add); granice.erase(xa); } int solve(pair<int, int> *tab, int XS) { REP(a, N) if (tab[a].first > tab[a].second) swap(tab[a].first, tab[a].second); tab[N++] = make_pair(XS - 1, XS - 1); sort(tab, tab + N); granice.clear(); granice.insert(0); granice.insert(XS); otwarte.clear(); otwarte.emplace_back(XS, 0); best = 0; REP(a, N) { int x1 = tab[a].first; int x2 = tab[a].second; czysc_do(x1); granice.insert(x1); while (otwarte.back().first <= x2) { best = max(best, otwarte.back().second); otwarte.pop_back(); } granice.insert(x2); } best = max(best, otwarte.back().second + 1); // zewnętrzny return best; } pair<int, int> tabx[500001], taby[500001]; int main() { int XS, YS; scanf("%d%d%d", &N, &XS, &YS); REP(a, N) scanf("%d%d%d%d", &tabx[a].first, &taby[a].first, &tabx[a].second, &taby[a].second); LL res = solve(tabx, XS); res *= solve(taby, YS); printf("%lld\n", res); } |