#include<cstdio> #include<iostream> #include<queue> #include<map> using namespace std; long long int exp = 37; long long int mod = 1000000000000037; long long int power[1000005]; priority_queue<pair<int, int> > que_down; priority_queue<pair<int, int> > que_left; map<long long int, long long int> map_down; map<long long int, long long int> map_left; void count_powers(int last) { power[0] = 1; for (int i = 1; i <= last + 1; i++) { power[i] = (power[i-1] * exp) % mod; } } int main() { ios_base::sync_with_stdio(0); long long int n, X, Y; long long int x1, y1, x2, y2, x, y, num; pair<long long int, long long int> qtop; cin >> n >> X >> Y; for(int i = 1; i <= n; i++) { cin >> x1 >> y1 >> x2 >> y2; que_down.push(make_pair((-1)*min(x1,x2), i)); que_down.push(make_pair((-1)*max(x1,x2), -i)); que_left.push(make_pair((-1)*min(y1,y2), i)); que_left.push(make_pair((-1)*max(y1,y2), -i)); } que_down.push(make_pair(0, 0)); que_down.push(make_pair(-X, 0)); que_left.push(make_pair(0, 0)); que_left.push(make_pair(-Y, 0)); count_powers(2*n+1); long long int best_down = 0, best_left = 0; long long int current = 0; long long int len; while(!que_down.empty()) { qtop = que_down.top(); x = (-1)*qtop.first; num = qtop.second; que_down.pop(); if(que_down.empty()) { break; } if(num < 0) { current = (current + mod - power[-num])%mod; } else { current = (current + power[num])%mod; } len = ((-1)*que_down.top().first) - x; map_down[current] += len; best_down = max(best_down, map_down[current]); } current = 0; while(!que_left.empty()) { qtop = que_left.top(); y = (-1)*qtop.first; num = qtop.second; que_left.pop(); if(que_left.empty()) { break; } if(num < 0) { current = (current + mod - power[-num])%mod; } else { current = (current + power[num])%mod; } len = ((-1)*que_left.top().first) - y; map_left[current] += len; best_left = max(best_left, map_left[current]); } cout << best_down*best_left << 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 | #include<cstdio> #include<iostream> #include<queue> #include<map> using namespace std; long long int exp = 37; long long int mod = 1000000000000037; long long int power[1000005]; priority_queue<pair<int, int> > que_down; priority_queue<pair<int, int> > que_left; map<long long int, long long int> map_down; map<long long int, long long int> map_left; void count_powers(int last) { power[0] = 1; for (int i = 1; i <= last + 1; i++) { power[i] = (power[i-1] * exp) % mod; } } int main() { ios_base::sync_with_stdio(0); long long int n, X, Y; long long int x1, y1, x2, y2, x, y, num; pair<long long int, long long int> qtop; cin >> n >> X >> Y; for(int i = 1; i <= n; i++) { cin >> x1 >> y1 >> x2 >> y2; que_down.push(make_pair((-1)*min(x1,x2), i)); que_down.push(make_pair((-1)*max(x1,x2), -i)); que_left.push(make_pair((-1)*min(y1,y2), i)); que_left.push(make_pair((-1)*max(y1,y2), -i)); } que_down.push(make_pair(0, 0)); que_down.push(make_pair(-X, 0)); que_left.push(make_pair(0, 0)); que_left.push(make_pair(-Y, 0)); count_powers(2*n+1); long long int best_down = 0, best_left = 0; long long int current = 0; long long int len; while(!que_down.empty()) { qtop = que_down.top(); x = (-1)*qtop.first; num = qtop.second; que_down.pop(); if(que_down.empty()) { break; } if(num < 0) { current = (current + mod - power[-num])%mod; } else { current = (current + power[num])%mod; } len = ((-1)*que_down.top().first) - x; map_down[current] += len; best_down = max(best_down, map_down[current]); } current = 0; while(!que_left.empty()) { qtop = que_left.top(); y = (-1)*qtop.first; num = qtop.second; que_left.pop(); if(que_left.empty()) { break; } if(num < 0) { current = (current + mod - power[-num])%mod; } else { current = (current + power[num])%mod; } len = ((-1)*que_left.top().first) - y; map_left[current] += len; best_left = max(best_left, map_left[current]); } cout << best_down*best_left << endl; return 0; } |