Cod sursa(job #115405)

Utilizator al3csutzuSirbu Alexandru al3csutzu Data 16 decembrie 2007 12:33:03
Problema Rays Scor 20
Compilator fpc Status done
Runda preONI 2008, Runda 2, Clasa a 10-a Marime 1.53 kb
program raze;
var f,g:text;
n,i,nr,k:longint;
aux,y1aux,y2aux:real;
x,y1,y2:array[1..200000] of real;
frx,fry1,fry2:array[1..200000] of real;
gasit:boolean;
begin
  assign(f,'rays.in'); assign(g,'rays.out');
  reset(f); rewrite(g);
  read(f,n);
  for i:=1 to n do
    read(f,x[i],y1[i],y2[i]);
  frx[1]:=x[1]; fry1[1]:=y1[1]; fry2[1]:=y2[1];
  if fry1[1]>fry2[1] then begin aux:=fry1[1]; fry1[1]:=fry2[1]; fry2[1]:=aux; end;
  nr:=1;
  for i:=2 to n do
  begin
    gasit:=false;
    for k:=1 to nr do
    if frx[k]*x[i]>0 then
    begin
      gasit:=false;
      y1aux:=frx[k]*y1[i]/x[i];
      y2aux:=frx[k]*y2[i]/x[i];
      if y1aux>y2aux then begin aux:=y1aux; y1aux:=y2aux; y2aux:=aux; end;
      if ((y1aux<=fry1[k]) and (fry2[k]<=y2aux)) then gasit:=true
      else
      begin
      if ((fry1[k]<=y1aux) and (y1aux<=fry2[k])) then
        begin gasit:=true; fry1[k]:=y1aux; end
        else
         if ((fry1[k]>=y1aux) and (y1aux>=fry2[k])) then
        begin gasit:=true; fry2[k]:=y1aux; end;
      if ((fry1[k]<=y2aux) and (y2aux<=fry2[k])) then
        begin gasit:=true; fry2[k]:=y2aux; end
        else
      if ((fry1[k]>=y2aux) and (y2aux>=fry2[k])) then
        begin gasit:=true; fry1[k]:=y2aux; end;
      end;
      if gasit then break;
    end;
    if not gasit then
    begin
    nr:=nr+1;
    frx[nr]:=x[i]; fry1[nr]:=y1[i]; fry2[nr]:=y2[i];
    if fry1[nr]>fry2[nr] then begin aux:=fry1[nr]; fry1[nr]:=fry2[nr]; fry2[nr]:=aux; end;
    end;
  end;
  writeln(g,nr);
  close(f); close(g);
end.