/* Arek Wróbel - skater * * Zadanie: Parking * Konkurs: PA2014, runda 3B */ #include <cstdio> #include <algorithm> #include <cmath> #include <vector> using namespace std; typedef long long LL; typedef pair<int, int> PII; typedef vector<int> VI; #define REP(I, N) for(int I=0; I<(N); ++I) #define FOR(I, M, N) for(int I=(M); I<=(N); ++I) #define FORD(I, M, N) for(int I=(M); I>=(N); --I) #define FOREACH(IT, CON) for(__typeof(CON.begin()) IT=CON.begin(); IT!=CON.end(); ++IT) #define ST first #define ND second #define MP make_pair #define PB push_back const int INF=1000000000; const LL INFLL=1000000000000000000LL; int n, w; struct ne { int x_st; int x_nd; int h; } t[60000]; int perm[60000]; inline bool cmp_xst(const ne a, const ne b) { return a.x_st < b.x_st; } inline bool cmp2(const int a, const int b) { return t[a].x_nd < t[b].x_nd; } const int C = 1<<16; // 65536 int T[2*C]; void clear() { REP(i, 2*C) T[i] = 0; } void put(int a, int h) { a+=C; T[a] = h; while (a>1) { T[a/2] = max(T[a/2], T[a]); a/=2; } } int get(int a) { a+=C; int wyn = T[a]; while (a>1) { if (a & 1) { wyn = max(wyn, T[a-1]); } a/=2; } return wyn; } bool make() { clear(); FORD(i, n-1, 0) { // printf(" %d: %d %d %d\n", i, perm[i], t[perm[i]].h, get(perm[i])); if (t[perm[i]].h + get(perm[i]) > w) return false; put(perm[i], t[perm[i]].h); } return true; } int main() { int tests; scanf("%d", &tests); while(tests--) { //wej scanf("%d%d", &n, &w); REP(i, n) { int x1, y1, x2, y2; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); t[i].x_st = min(x1, x2); t[i].h = abs(y1 - y2); } REP(i, n) { int x1, y1, x2, y2; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); t[i].x_nd = min(x1, x2); } //prog sort(t, t+n, cmp_xst); REP(i, n) perm[i] = i; sort(perm, perm+n, cmp2); // REP(i, n) printf("%d: %d %d\n", i, perm[i], t[perm[i]].h); //wyj printf(make() ? "TAK\n" : "NIE\n"); } 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 110 | /* Arek Wróbel - skater * * Zadanie: Parking * Konkurs: PA2014, runda 3B */ #include <cstdio> #include <algorithm> #include <cmath> #include <vector> using namespace std; typedef long long LL; typedef pair<int, int> PII; typedef vector<int> VI; #define REP(I, N) for(int I=0; I<(N); ++I) #define FOR(I, M, N) for(int I=(M); I<=(N); ++I) #define FORD(I, M, N) for(int I=(M); I>=(N); --I) #define FOREACH(IT, CON) for(__typeof(CON.begin()) IT=CON.begin(); IT!=CON.end(); ++IT) #define ST first #define ND second #define MP make_pair #define PB push_back const int INF=1000000000; const LL INFLL=1000000000000000000LL; int n, w; struct ne { int x_st; int x_nd; int h; } t[60000]; int perm[60000]; inline bool cmp_xst(const ne a, const ne b) { return a.x_st < b.x_st; } inline bool cmp2(const int a, const int b) { return t[a].x_nd < t[b].x_nd; } const int C = 1<<16; // 65536 int T[2*C]; void clear() { REP(i, 2*C) T[i] = 0; } void put(int a, int h) { a+=C; T[a] = h; while (a>1) { T[a/2] = max(T[a/2], T[a]); a/=2; } } int get(int a) { a+=C; int wyn = T[a]; while (a>1) { if (a & 1) { wyn = max(wyn, T[a-1]); } a/=2; } return wyn; } bool make() { clear(); FORD(i, n-1, 0) { // printf(" %d: %d %d %d\n", i, perm[i], t[perm[i]].h, get(perm[i])); if (t[perm[i]].h + get(perm[i]) > w) return false; put(perm[i], t[perm[i]].h); } return true; } int main() { int tests; scanf("%d", &tests); while(tests--) { //wej scanf("%d%d", &n, &w); REP(i, n) { int x1, y1, x2, y2; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); t[i].x_st = min(x1, x2); t[i].h = abs(y1 - y2); } REP(i, n) { int x1, y1, x2, y2; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); t[i].x_nd = min(x1, x2); } //prog sort(t, t+n, cmp_xst); REP(i, n) perm[i] = i; sort(perm, perm+n, cmp2); // REP(i, n) printf("%d: %d %d\n", i, perm[i], t[perm[i]].h); //wyj printf(make() ? "TAK\n" : "NIE\n"); } return 0; } |