#include <bits/stdc++.h>
using namespace std;
const int INF = 2e9;
const int MAXN = 500002;
vector<long long> powers;
long long M, P;
class HashSet {
public:
HashSet() {
hash = 0;
}
void changeValue(int i) {
if (bits[i] == 0) {
hash = (hash + powers[i]) % M;
bits[i] = 1;
}
else if (bits[i] == 1) {
hash = (hash - powers[i] + M) % M;
bits[i] = 0;
}
}
long long getHash() {
return hash;
}
private:
bitset<MAXN> bits;
long long hash;
};
int main() {
ios_base::sync_with_stdio(false);
int n, x, y;
cin >> n >> x >> y;
M = 1000000007;
P = 31;
powers.push_back(1);
for (int i = 1; i <= n; i++) {
powers.push_back((powers.back() * P) % M);
}
HashSet xx;
HashSet yy;
vector <pair<int, int> > x_vec;
vector <pair<int, int> > y_vec;
unordered_map <long long, int> x_map;
unordered_map <long long, int> y_map;
for (int i = 0; i < n; i++) {
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
x_vec.push_back(make_pair(x1, i));
x_vec.push_back(make_pair(x2, i));
y_vec.push_back(make_pair(y1, i));
y_vec.push_back(make_pair(y2, i));
}
sort(x_vec.begin(), x_vec.end());
sort(y_vec.begin(), y_vec.end());
x_map[xx.getHash()] = x_vec.front().first;
x_map[xx.getHash()] += x - x_vec.back().first;
int x_max = x_map[xx.getHash()];
int previous_x = x_vec.front().first;
for (int i = 0; i < 2 * n;) {
while(i < 2 * n && x_vec[i].first == previous_x) {
xx.changeValue(x_vec[i].second);
i++;
}
if (i < 2 * n) {
x_map[xx.getHash()] += (x_vec[i].first - previous_x);
x_max = max(x_max, x_map[xx.getHash()]);
previous_x = x_vec[i].first;
}
}
// cout << "vector" << endl;
// for (auto& x : x_vec) {
// cout << x.first << " " << x.second << endl;
// }
// cout << "map" << endl;
// for (auto& x : x_map) {
// cout << x.first << " " << x.second << endl;
// }
y_map[yy.getHash()] = y_vec.front().first;
y_map[yy.getHash()] += y - y_vec.back().first;
int y_max = y_map[yy.getHash()];
int previous_y = y_vec.front().first;
for (int i = 0; i < 2 * n;) {
while(i < 2 * n && y_vec[i].first == previous_y) {
yy.changeValue(y_vec[i].second);
i++;
}
if (i < 2 * n) {
y_map[yy.getHash()] += (y_vec[i].first - previous_y);
y_max = max(y_max, y_map[yy.getHash()]);
previous_y = y_vec[i].first;
}
}
// cout << "vector" << endl;
// for (auto& y : y_vec) {
// cout << y.first << " " << y.second << endl;
// }
// cout << "map" << endl;
// for (auto& y : y_map) {
// cout << y.first << " " << y.second << endl;
// }
cout << (long long)x_max * y_max << 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 | #include <bits/stdc++.h> using namespace std; const int INF = 2e9; const int MAXN = 500002; vector<long long> powers; long long M, P; class HashSet { public: HashSet() { hash = 0; } void changeValue(int i) { if (bits[i] == 0) { hash = (hash + powers[i]) % M; bits[i] = 1; } else if (bits[i] == 1) { hash = (hash - powers[i] + M) % M; bits[i] = 0; } } long long getHash() { return hash; } private: bitset<MAXN> bits; long long hash; }; int main() { ios_base::sync_with_stdio(false); int n, x, y; cin >> n >> x >> y; M = 1000000007; P = 31; powers.push_back(1); for (int i = 1; i <= n; i++) { powers.push_back((powers.back() * P) % M); } HashSet xx; HashSet yy; vector <pair<int, int> > x_vec; vector <pair<int, int> > y_vec; unordered_map <long long, int> x_map; unordered_map <long long, int> y_map; for (int i = 0; i < n; i++) { int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; x_vec.push_back(make_pair(x1, i)); x_vec.push_back(make_pair(x2, i)); y_vec.push_back(make_pair(y1, i)); y_vec.push_back(make_pair(y2, i)); } sort(x_vec.begin(), x_vec.end()); sort(y_vec.begin(), y_vec.end()); x_map[xx.getHash()] = x_vec.front().first; x_map[xx.getHash()] += x - x_vec.back().first; int x_max = x_map[xx.getHash()]; int previous_x = x_vec.front().first; for (int i = 0; i < 2 * n;) { while(i < 2 * n && x_vec[i].first == previous_x) { xx.changeValue(x_vec[i].second); i++; } if (i < 2 * n) { x_map[xx.getHash()] += (x_vec[i].first - previous_x); x_max = max(x_max, x_map[xx.getHash()]); previous_x = x_vec[i].first; } } // cout << "vector" << endl; // for (auto& x : x_vec) { // cout << x.first << " " << x.second << endl; // } // cout << "map" << endl; // for (auto& x : x_map) { // cout << x.first << " " << x.second << endl; // } y_map[yy.getHash()] = y_vec.front().first; y_map[yy.getHash()] += y - y_vec.back().first; int y_max = y_map[yy.getHash()]; int previous_y = y_vec.front().first; for (int i = 0; i < 2 * n;) { while(i < 2 * n && y_vec[i].first == previous_y) { yy.changeValue(y_vec[i].second); i++; } if (i < 2 * n) { y_map[yy.getHash()] += (y_vec[i].first - previous_y); y_max = max(y_max, y_map[yy.getHash()]); previous_y = y_vec[i].first; } } // cout << "vector" << endl; // for (auto& y : y_vec) { // cout << y.first << " " << y.second << endl; // } // cout << "map" << endl; // for (auto& y : y_map) { // cout << y.first << " " << y.second << endl; // } cout << (long long)x_max * y_max << endl; return 0; } |
English