Cod sursa(job #44524)
Utilizator | Data | 31 martie 2007 15:05:01 | |
---|---|---|---|
Problema | Regiuni | Scor | 10 |
Compilator | fpc | Status | done |
Runda | Arhiva de probleme | Marime | 3.49 kb |
{
Problema regiuni
}
Program regiuni;
Type dreapta = record
a, b, c : Integer;
end;
ref = ^elm;
elm = record
x, y : Integer;
adr : ref;
end;
Var n, m, i, j, k, kf : Integer;
d : array[1..500] of dreapta;
l : array[1..500] of ref;
e, f, g : ref;
mm, nn : real;
vert, cod, codp : boolean;
Begin
Assign( input, 'regiuni.in' );
Reset( input );
Readln( n, m );
For i := 1 to n do
Readln( d[i].a, d[i].b, d[i].c );
k := 1;
l[k] := nil;
For i := 1 to m do
Begin
new( e );
Readln( e^.x, e^.y );
e^.adr := l[k];
l[k] := e;
End;
Close( input );
For i := 1 to n do
Begin
if d[i].b = 0 then
Begin
vert := true;
mm := 0;
nn := -d[i].c/d[i].a;
End
else
Begin
vert := false;
mm := -d[i].a/d[i].b;
nn := -d[i].c/d[i].b;
End;
kf := k;
For j := 1 to kf do
Begin
k := k+1;
l[k] := nil;
e := l[j];
Case vert of
true: if e^.x > nn then codp := true
else codp := false;
false: if e^.y < mm*e^.x + nn then codp := true
else codp := false;
End;
g := e;
e := e^.adr;
while e <> nil do
Begin
Case vert of
true: if e^.x > nn then cod := true
else cod := false;
false: if e^.y < mm*e^.x + nn then cod := true
else cod := false;
End;
If cod <> codp then
Begin
new( f );
f^.x := e^.x;
f^.y := e^.y;
f^.adr := l[k];
l[k] := f;
g^.adr := e^.adr;
dispose( e );
e := g^.adr;
End
else
Begin
g := e;
e := e^.adr;
End;
End;
if l[k] = nil then Begin k := k-1; dispose(l[k+1]); End;
End;
End;
Assign( output, 'regiuni.out' );
Rewrite( output );
Writeln( k );
Close( output );
For i := 1 to k do
While l[i] <> nil do
Begin
e := l[i];
l[i] := l[i]^.adr;
dispose( e );
End;
End.