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); } } |
English