program parking; type pozycja=record x1,x2,y1,y2 : int64; end; samochod=record wysokosc : longint; pozPocz,pozKon : pozycja; end; tab=array [1..50002] of samochod; var ustawienia : tab; i,j,k,t,n : integer; w,max : longint; koniec : boolean; procedure quick(od,do_ : longint); var i,j,x : longint; temp : samochod; begin i:=od; j:=do_; x:=ustawienia[(od+do_) div 2].wysokosc; repeat while ustawienia[i].wysokosc>x do inc(i); while x>ustawienia[j].wysokosc do dec(j); if i<=j then begin temp:=ustawienia[i]; ustawienia[i]:=ustawienia[j]; ustawienia[j]:=temp; inc(i); dec(j); end; until i>j; if od<j then quick(od,j); if i<do_ then quick(i,do_); end; begin readln(t); for i:=1 to t do begin read(n); readln(w); for j:=1 to n do begin read(ustawienia[j].pozPocz.x1); read(ustawienia[j].pozPocz.y1); read(ustawienia[j].pozPocz.x2); readln(ustawienia[j].pozPocz.y2); ustawienia[j].wysokosc:=ustawienia[j].pozPocz.y2-ustawienia[j].pozPocz.y1; end; for j:=1 to n do begin read(ustawienia[j].pozKon.x1); read(ustawienia[j].pozKon.y1); read(ustawienia[j].pozKon.x2); readln(ustawienia[j].pozKon.y2); end; quick(1,n); j:=1; max:=ustawienia[j].wysokosc; koniec:=false; while (not koniec)and(ustawienia[j].wysokosc+max>w)and(j<=n) do begin k:=j+1; while (not koniec)and(ustawienia[j].wysokosc+ustawienia[k].wysokosc>w)and(k<=n) do begin if ((ustawienia[k].pozPocz.x1>=ustawienia[j].pozPocz.x2)and (ustawienia[k].pozKon.x1<ustawienia[j].pozKon.x2))or ((ustawienia[j].pozPocz.x1>=ustawienia[k].pozPocz.x2)and (ustawienia[j].pozKon.x1<ustawienia[k].pozKon.x2)) then koniec:=true; inc(k); end; inc(j); end; if koniec then writeln('NIE') else writeln('TAK'); end; end.
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 | program parking; type pozycja=record x1,x2,y1,y2 : int64; end; samochod=record wysokosc : longint; pozPocz,pozKon : pozycja; end; tab=array [1..50002] of samochod; var ustawienia : tab; i,j,k,t,n : integer; w,max : longint; koniec : boolean; procedure quick(od,do_ : longint); var i,j,x : longint; temp : samochod; begin i:=od; j:=do_; x:=ustawienia[(od+do_) div 2].wysokosc; repeat while ustawienia[i].wysokosc>x do inc(i); while x>ustawienia[j].wysokosc do dec(j); if i<=j then begin temp:=ustawienia[i]; ustawienia[i]:=ustawienia[j]; ustawienia[j]:=temp; inc(i); dec(j); end; until i>j; if od<j then quick(od,j); if i<do_ then quick(i,do_); end; begin readln(t); for i:=1 to t do begin read(n); readln(w); for j:=1 to n do begin read(ustawienia[j].pozPocz.x1); read(ustawienia[j].pozPocz.y1); read(ustawienia[j].pozPocz.x2); readln(ustawienia[j].pozPocz.y2); ustawienia[j].wysokosc:=ustawienia[j].pozPocz.y2-ustawienia[j].pozPocz.y1; end; for j:=1 to n do begin read(ustawienia[j].pozKon.x1); read(ustawienia[j].pozKon.y1); read(ustawienia[j].pozKon.x2); readln(ustawienia[j].pozKon.y2); end; quick(1,n); j:=1; max:=ustawienia[j].wysokosc; koniec:=false; while (not koniec)and(ustawienia[j].wysokosc+max>w)and(j<=n) do begin k:=j+1; while (not koniec)and(ustawienia[j].wysokosc+ustawienia[k].wysokosc>w)and(k<=n) do begin if ((ustawienia[k].pozPocz.x1>=ustawienia[j].pozPocz.x2)and (ustawienia[k].pozKon.x1<ustawienia[j].pozKon.x2))or ((ustawienia[j].pozPocz.x1>=ustawienia[k].pozPocz.x2)and (ustawienia[j].pozKon.x1<ustawienia[k].pozKon.x2)) then koniec:=true; inc(k); end; inc(j); end; if koniec then writeln('NIE') else writeln('TAK'); end; end. |