#include<stdio.h> #include<stdlib.h> int n; int w; //#define ASSERT #define ISORT(a,b) if(a>b) { int tmp=a; a=b; b=tmp; } struct Car { int ix1,ix2, iy1,iy2; int ox1,ox2, oy1,oy2; int height; int i; int pos; void readIn(int i) { this->i=i; this->pos=-1; scanf("%d %d %d %d",&ix1, &iy1, &ix2, &iy2); ISORT(ix1,ix2); ISORT(iy1,iy2); #ifdef ASSERT if(ix1>=ix2) printf("FATAL IN\n"); #endif // TODO: Poprawiac wpisy, aby x1<x2 i y1<y2 this->height=iy2-iy1; } void readOut(int i) { // assert this->==i; scanf("%d %d %d %d",&ox1, &oy1, &ox2, &oy2); ISORT(ox1,ox2); ISORT(oy1,oy2); #ifdef ASSERT if(ox1>=ox2) printf("FATAL OUT\n"); if( (iy2-iy1) != (oy2-oy1) ) printf("FATAL HEIGHT\n"); if( (ix2-ix1) != (ox2-ox1) ) printf("FATAL WIDTH\n"); #endif // TODO: Poprawiac wpisy, aby x1<x2 i y1<y2 } }; Car* data; Car** in; Car** out; #define SC(x) (*((Car**)x)) int carSortIn(const void* v1, const void *v2) { return SC(v1)->ix2 - SC(v2)->ix2; } int carSortOut(const void* v1, const void *v2) { return SC(v1)->ox2 - SC(v2)->ox2; } void logState(const char* msg, Car** state) { #ifdef DEBUG printf("%s [%d]:\n",msg,n); for(int i=0;i<n;++i) printf(" % 3d @%d (%d,%d-%d,%d)+(%d,%d-%d,%d)\n",state[i]->i+1,state[i]->pos, state[i]->ix1,state[i]->iy1,state[i]->ix2,state[i]->iy2, state[i]->ox1,state[i]->oy1,state[i]->ox2,state[i]->oy2 ); #endif } /** Przetwarza dane */ bool process() { for(int i=0;i<n;++i) { Car* c=out[i]; // po kolei kazdy samochów według koncowego ułożenia int left=w - c->height; // tyle jest wolnego miejsca while(c->pos>i) { // idziemy w lewo Car* sw=in[c->pos-1]; // do sprawdzenia if( sw->height>left) { #ifdef DEBUG printf("Invalid state at %d (%d !! %d)\n",c->pos,c->i+1, sw->i+1); logState("State", in); #endif return false; // samochod sie nie przecisnie } sw->pos++; // aktualizacja pozycji in[sw->pos]=sw; // aktualizacja w tablicy c->pos--; } in[c->pos]=c; // aktualizacja w tablicy } return true; } int main() { data=(Car*)malloc(sizeof(Car)* 50000); in=(Car**)malloc(sizeof(Car*)* 50000); out=(Car**)malloc(sizeof(Car*)* 50000); int tests; scanf("%d",&tests); // iteracja po testach for(int test=0;test<tests;++test) { // odczyt danych jednego testu scanf("%d %d",&n,&w); for(int i=0;i<n;++i) { in[i]=&data[i]; in[i]->readIn(i); } for(int i=0;i<n;++i) { out[i]=&data[i]; out[i]->readOut(i); } logState("Readed",in); qsort(in,n,sizeof(Car*),carSortIn); qsort(out,n,sizeof(Car*),carSortOut); for(int i=0;i<n;++i) in[i]->pos=i; logState("Input sorted",in); logState("Output sorted",out); printf("%s\n",process()?"TAK":"NIE"); } 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 111 112 113 114 115 116 117 | #include<stdio.h> #include<stdlib.h> int n; int w; //#define ASSERT #define ISORT(a,b) if(a>b) { int tmp=a; a=b; b=tmp; } struct Car { int ix1,ix2, iy1,iy2; int ox1,ox2, oy1,oy2; int height; int i; int pos; void readIn(int i) { this->i=i; this->pos=-1; scanf("%d %d %d %d",&ix1, &iy1, &ix2, &iy2); ISORT(ix1,ix2); ISORT(iy1,iy2); #ifdef ASSERT if(ix1>=ix2) printf("FATAL IN\n"); #endif // TODO: Poprawiac wpisy, aby x1<x2 i y1<y2 this->height=iy2-iy1; } void readOut(int i) { // assert this->==i; scanf("%d %d %d %d",&ox1, &oy1, &ox2, &oy2); ISORT(ox1,ox2); ISORT(oy1,oy2); #ifdef ASSERT if(ox1>=ox2) printf("FATAL OUT\n"); if( (iy2-iy1) != (oy2-oy1) ) printf("FATAL HEIGHT\n"); if( (ix2-ix1) != (ox2-ox1) ) printf("FATAL WIDTH\n"); #endif // TODO: Poprawiac wpisy, aby x1<x2 i y1<y2 } }; Car* data; Car** in; Car** out; #define SC(x) (*((Car**)x)) int carSortIn(const void* v1, const void *v2) { return SC(v1)->ix2 - SC(v2)->ix2; } int carSortOut(const void* v1, const void *v2) { return SC(v1)->ox2 - SC(v2)->ox2; } void logState(const char* msg, Car** state) { #ifdef DEBUG printf("%s [%d]:\n",msg,n); for(int i=0;i<n;++i) printf(" % 3d @%d (%d,%d-%d,%d)+(%d,%d-%d,%d)\n",state[i]->i+1,state[i]->pos, state[i]->ix1,state[i]->iy1,state[i]->ix2,state[i]->iy2, state[i]->ox1,state[i]->oy1,state[i]->ox2,state[i]->oy2 ); #endif } /** Przetwarza dane */ bool process() { for(int i=0;i<n;++i) { Car* c=out[i]; // po kolei kazdy samochów według koncowego ułożenia int left=w - c->height; // tyle jest wolnego miejsca while(c->pos>i) { // idziemy w lewo Car* sw=in[c->pos-1]; // do sprawdzenia if( sw->height>left) { #ifdef DEBUG printf("Invalid state at %d (%d !! %d)\n",c->pos,c->i+1, sw->i+1); logState("State", in); #endif return false; // samochod sie nie przecisnie } sw->pos++; // aktualizacja pozycji in[sw->pos]=sw; // aktualizacja w tablicy c->pos--; } in[c->pos]=c; // aktualizacja w tablicy } return true; } int main() { data=(Car*)malloc(sizeof(Car)* 50000); in=(Car**)malloc(sizeof(Car*)* 50000); out=(Car**)malloc(sizeof(Car*)* 50000); int tests; scanf("%d",&tests); // iteracja po testach for(int test=0;test<tests;++test) { // odczyt danych jednego testu scanf("%d %d",&n,&w); for(int i=0;i<n;++i) { in[i]=&data[i]; in[i]->readIn(i); } for(int i=0;i<n;++i) { out[i]=&data[i]; out[i]->readOut(i); } logState("Readed",in); qsort(in,n,sizeof(Car*),carSortIn); qsort(out,n,sizeof(Car*),carSortOut); for(int i=0;i<n;++i) in[i]->pos=i; logState("Input sorted",in); logState("Output sorted",out); printf("%s\n",process()?"TAK":"NIE"); } return 0; } |