Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8.
Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
#include <algorithm> #include <vector> #include <cstdio> #define MAX 500009 using namespace std; struct car{ int x, y, w, h, oldx; int numer, index; car() {}; car(int x, int y, int w, int h, int index){ this->x = x; this->h = h; this->index = index; } }; int tab[MAX]; vector<car> przed, po; int wysokosc; #define DB if(0) vector<car> merge_sort(vector<car> a, int h){ //for(int i=0; i<a.size(); i++)printf("%d ", a[i].index); //printf("\n"); if(a.size() == 1)return a; vector <car> p1, p2; int siz = a.size(); for(int i=0; i<siz; i++){ if(i<siz/2)p1.push_back(a[i]); else p2.push_back(a[i]); } p1 = merge_sort(p1, h); p2 = merge_sort(p2, h); int c = 0, b = 0; a.clear(); while(c < p1.size() && b < p2.size()){ DB printf("przerabiam %d %d\n", p1[c].index, p2[b].index); if(p1[c].h + p2[b].h > h){ /// bo by�y wst�pnie posortowanie po x-ach, wi�c ten z p1 b�dzie mniejszy DB printf("wrzucam %d bo sie nie mieszcza\n", p1[c].index); a.push_back(p1[c++]); continue; } if(p1[c].h == p2[b].h){ if(p1[c].index < p2[b].index) a.push_back(p1[c++]); else a.push_back(p2[b++]); //DB printf("wrzucam %d bo rowne wysokosci\n", p1[c].index); continue; } if(p1[c].h < p2[b].h){ /// je�li p1[c] jest ni�sze to jest pierwsze, je�li p2[b] to drugie DB printf("wrzucam %d bo jest nizsze\n", p1[c].index); a.push_back(p1[c++]); } else{ DB printf("wrzucam %d bo jest nizsze\n", p2[b].index); a.push_back(p2[b++]); } } /// dobijam ko�c�wki while(c < p1.size()) a.push_back(p1[c++]); while(b < p2.size()) a.push_back(p2[b++]); //for(car _car : a)printf("i: %d ", _car.index); //printf("\n"); return a; } void clears(int n){ przed.clear(); po.clear(); } bool fun2(car a, car b){ if(a.x == b.x)return a.index < b.index; return a.x < b.x; } void wypisz(car a){ //printf("i: %d\n", a.index); } int main(){ int t; scanf("%d", &t); while(t--){ int n, w; scanf("%d%d", &n, &w); wysokosc = w; int a, b, c, d; for(int i=1; i<=n; i++){ scanf("%d%d%d%d", &a, &b, &c, &d); przed.push_back(car(a, b, abs(c-a), abs(b-d), i)); przed.back().oldx = a; } for(int i=1; i<=n; i++){ scanf("%d%d%d%d", &a, &b, &c, &d); po.push_back(car(a, b, abs(c-a), abs(b-d), i)); } for(int i=1; i<=n; i++){ po[i-1].oldx = przed[i-1].x; } sort(przed.begin(), przed.end(), fun2); sort(po.begin(), po.end(), fun2); przed = merge_sort(przed, w); po = merge_sort(po, w); bool ok = true; for(int i=0; i<przed.size(); i++){ if(przed[i].index != po[i].index)ok = false; } if(ok)printf("TAK\n"); else printf("NIE\n"); clears(n); } }
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 118 119 | #include <algorithm> #include <vector> #include <cstdio> #define MAX 500009 using namespace std; struct car{ int x, y, w, h, oldx; int numer, index; car() {}; car(int x, int y, int w, int h, int index){ this->x = x; this->h = h; this->index = index; } }; int tab[MAX]; vector<car> przed, po; int wysokosc; #define DB if(0) vector<car> merge_sort(vector<car> a, int h){ //for(int i=0; i<a.size(); i++)printf("%d ", a[i].index); //printf("\n"); if(a.size() == 1)return a; vector <car> p1, p2; int siz = a.size(); for(int i=0; i<siz; i++){ if(i<siz/2)p1.push_back(a[i]); else p2.push_back(a[i]); } p1 = merge_sort(p1, h); p2 = merge_sort(p2, h); int c = 0, b = 0; a.clear(); while(c < p1.size() && b < p2.size()){ DB printf("przerabiam %d %d\n", p1[c].index, p2[b].index); if(p1[c].h + p2[b].h > h){ /// bo by�y wst�pnie posortowanie po x-ach, wi�c ten z p1 b�dzie mniejszy DB printf("wrzucam %d bo sie nie mieszcza\n", p1[c].index); a.push_back(p1[c++]); continue; } if(p1[c].h == p2[b].h){ if(p1[c].index < p2[b].index) a.push_back(p1[c++]); else a.push_back(p2[b++]); //DB printf("wrzucam %d bo rowne wysokosci\n", p1[c].index); continue; } if(p1[c].h < p2[b].h){ /// je�li p1[c] jest ni�sze to jest pierwsze, je�li p2[b] to drugie DB printf("wrzucam %d bo jest nizsze\n", p1[c].index); a.push_back(p1[c++]); } else{ DB printf("wrzucam %d bo jest nizsze\n", p2[b].index); a.push_back(p2[b++]); } } /// dobijam ko�c�wki while(c < p1.size()) a.push_back(p1[c++]); while(b < p2.size()) a.push_back(p2[b++]); //for(car _car : a)printf("i: %d ", _car.index); //printf("\n"); return a; } void clears(int n){ przed.clear(); po.clear(); } bool fun2(car a, car b){ if(a.x == b.x)return a.index < b.index; return a.x < b.x; } void wypisz(car a){ //printf("i: %d\n", a.index); } int main(){ int t; scanf("%d", &t); while(t--){ int n, w; scanf("%d%d", &n, &w); wysokosc = w; int a, b, c, d; for(int i=1; i<=n; i++){ scanf("%d%d%d%d", &a, &b, &c, &d); przed.push_back(car(a, b, abs(c-a), abs(b-d), i)); przed.back().oldx = a; } for(int i=1; i<=n; i++){ scanf("%d%d%d%d", &a, &b, &c, &d); po.push_back(car(a, b, abs(c-a), abs(b-d), i)); } for(int i=1; i<=n; i++){ po[i-1].oldx = przed[i-1].x; } sort(przed.begin(), przed.end(), fun2); sort(po.begin(), po.end(), fun2); przed = merge_sort(przed, w); po = merge_sort(po, w); bool ok = true; for(int i=0; i<przed.size(); i++){ if(przed[i].index != po[i].index)ok = false; } if(ok)printf("TAK\n"); else printf("NIE\n"); clears(n); } } |