#include <bits/stdc++.h> int n, X, Y; int x, y; long long int wynik; struct prostokat{ std::pair<int, int>p; std::pair<int, int>d; }; prostokat tab[10003][4]; std::vector<prostokat>wybrane; long long int przedzialy() { prostokat e; e=wybrane[0]; for(int i=1; i<wybrane.size(); i++) { e.p.first=std::max(e.p.first, wybrane[i].p.first); e.d.first=std::min(e.d.first, wybrane[i].d.first); e.p.second=std::max(e.p.second, wybrane[i].p.second); e.d.second=std::min(e.d.second, wybrane[i].d.second); if(e.p.first>=e.d.first) return 0; if(e.p.second>=e.d.second) return 0; } /* printf("[%d %d] [%d %d]\n", e.p.first, e.p.second, e.d.first, e.d.second); */ return (long long)((long long)e.d.first-e.p.first)*((long long)e.d.second-e.p.second); } long long int policz(int maska) { wybrane.clear(); /* printf("WYBRANE: "); */ for(int i=0; i<n; i++) { int wart=0; if(maska&(1<<(2*i))) wart+=2; if(maska&(1<<(2*i+1))) wart+=1; /* printf("%d ", wart); */ wybrane.push_back(tab[i][wart]); } /* printf("\n"); */ return przedzialy(); } int main() { scanf("%d%d%d", &n, &X, &Y); for(int i=0; i<n; i++) { scanf("%d%d%d%d", &tab[i][0].p.first, &tab[i][0].p.second, &tab[i][0].d.first, &tab[i][0].d.second); if(tab[i][0].p.first>tab[i][0].d.first) std::swap(tab[i][0].p.first, tab[i][0].d.first); if(tab[i][0].p.second>tab[i][0].d.second) std::swap(tab[i][0].p.second, tab[i][0].d.second); tab[i][1].p={tab[i][0].d.first, tab[i][0].p.second}; tab[i][1].d={tab[i][0].p.first+X+1, tab[i][0].d.second}; tab[i][2].p={tab[i][0].p.first, tab[i][0].d.second}; tab[i][2].d={tab[i][0].d.first, tab[i][0].p.second+Y+1}; tab[i][3].p={tab[i][0].d.first, tab[i][0].d.second}; tab[i][3].d={tab[i][0].p.first+X+1, tab[i][0].p.second+Y+1}; } /* for(int i=0; i<n; i++) */ /* { */ /* printf("PROSTOKAT %d\n", i); */ /* for(int j=0; j<4; j++) */ /* printf("[%d %d][%d %d]\n", tab[i][j].p.first, tab[i][j].p.second, tab[i][j].d.first, tab[i][j].d.second); */ /* } */ for(int i=0; i<((1LL<<n)*(1LL<<n)); i++) wynik=std::max(wynik, policz(i)); printf("%lld\n", wynik); }
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 <bits/stdc++.h> int n, X, Y; int x, y; long long int wynik; struct prostokat{ std::pair<int, int>p; std::pair<int, int>d; }; prostokat tab[10003][4]; std::vector<prostokat>wybrane; long long int przedzialy() { prostokat e; e=wybrane[0]; for(int i=1; i<wybrane.size(); i++) { e.p.first=std::max(e.p.first, wybrane[i].p.first); e.d.first=std::min(e.d.first, wybrane[i].d.first); e.p.second=std::max(e.p.second, wybrane[i].p.second); e.d.second=std::min(e.d.second, wybrane[i].d.second); if(e.p.first>=e.d.first) return 0; if(e.p.second>=e.d.second) return 0; } /* printf("[%d %d] [%d %d]\n", e.p.first, e.p.second, e.d.first, e.d.second); */ return (long long)((long long)e.d.first-e.p.first)*((long long)e.d.second-e.p.second); } long long int policz(int maska) { wybrane.clear(); /* printf("WYBRANE: "); */ for(int i=0; i<n; i++) { int wart=0; if(maska&(1<<(2*i))) wart+=2; if(maska&(1<<(2*i+1))) wart+=1; /* printf("%d ", wart); */ wybrane.push_back(tab[i][wart]); } /* printf("\n"); */ return przedzialy(); } int main() { scanf("%d%d%d", &n, &X, &Y); for(int i=0; i<n; i++) { scanf("%d%d%d%d", &tab[i][0].p.first, &tab[i][0].p.second, &tab[i][0].d.first, &tab[i][0].d.second); if(tab[i][0].p.first>tab[i][0].d.first) std::swap(tab[i][0].p.first, tab[i][0].d.first); if(tab[i][0].p.second>tab[i][0].d.second) std::swap(tab[i][0].p.second, tab[i][0].d.second); tab[i][1].p={tab[i][0].d.first, tab[i][0].p.second}; tab[i][1].d={tab[i][0].p.first+X+1, tab[i][0].d.second}; tab[i][2].p={tab[i][0].p.first, tab[i][0].d.second}; tab[i][2].d={tab[i][0].d.first, tab[i][0].p.second+Y+1}; tab[i][3].p={tab[i][0].d.first, tab[i][0].d.second}; tab[i][3].d={tab[i][0].p.first+X+1, tab[i][0].p.second+Y+1}; } /* for(int i=0; i<n; i++) */ /* { */ /* printf("PROSTOKAT %d\n", i); */ /* for(int j=0; j<4; j++) */ /* printf("[%d %d][%d %d]\n", tab[i][j].p.first, tab[i][j].p.second, tab[i][j].d.first, tab[i][j].d.second); */ /* } */ for(int i=0; i<((1LL<<n)*(1LL<<n)); i++) wynik=std::max(wynik, policz(i)); printf("%lld\n", wynik); } |