Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program g2;
- {$APPTYPE CONSOLE}
- uses
- SysUtils,
- Math;
- const
- eps = 1e-10;
- type
- TEvent = record
- x: Extended;
- typ: Integer;
- end;
- var
- a: array [1..100000] of TEvent;
- i, n, point, count, start: Integer;
- r1, r2, pr1, pr2, fi1, fi2: Extended;
- angle, answer: Extended;
- procedure sort(l, r: Integer);
- var
- i, j: Integer;
- x, w: TEvent;
- function less(x, y: TEvent): Boolean;
- begin
- Result := (x.x < y.x - eps) or (IsZero(x.x - y.x, eps) and (x.typ < y.typ));
- end;
- begin
- i := l;
- j := r;
- x := a[(l + r) div 2];
- repeat
- while less(a[i], x) do inc(i);
- while less(x, a[i]) do dec(j);
- if (i <= j) then
- begin
- w := a[i];
- a[i] := a[j];
- a[j] := w;
- inc(i);
- dec(j);
- end;
- until (i > j);
- if (i < r) then sort(i, r);
- if (l < j) then sort(l, j);
- end;
- procedure intersect(var rr1, rr2: Extended; r1, r2: Extended);
- begin
- if (r1 > rr2 - eps) or (rr1 > r2 - eps) then
- begin
- rr1 := 0;
- rr2 := 0;
- Exit;
- end;
- if (rr1 < r1 + eps) and (rr2 > r2 - eps) then
- begin
- rr1 := r1;
- rr2 := r2;
- end;
- if (r1 < rr1 + eps) and (r2 > rr2 - eps) then
- begin
- rr1 := rr1;
- rr2 := rr2;
- end;
- if (rr1 > r1 - eps) and (rr2 > rr2 - eps) then
- begin
- rr1 := rr1;
- rr2 := r2;
- end;
- if (r1 > rr1 - eps) and (r2 > rr2 - eps) then
- begin
- rr1 := r1;
- rr2 := rr2;
- end;
- end;
- procedure add(a1, a2: Extended);
- begin
- if (a1 > a2 + eps) then
- begin
- add(a1, 2 * pi);
- add(0, a2);
- Exit;
- end;
- inc(point);
- a[point].x := a1;
- a[point].typ := 1;
- inc(point);
- a[point].x := a2;
- a[point].typ := -1;
- end;
- begin
- reset(input, 'input.txt');
- rewrite(output, 'output.txt');
- Readln(n);
- Readln(pr1, pr2, fi1, fi2);
- add(fi2, fi1);
- for i := 1 to n do
- begin
- Readln(r1, r2, fi1, fi2);
- intersect(pr1, pr2, r1, r2);
- if IsZero(r1, eps) and IsZero(r2, eps) then
- begin
- Writeln(0);
- Halt(0);
- end;
- add(fi2, fi1);
- end;
- sort(1, point);
- count := 0;
- angle := 0;
- start := 0;
- for i := 1 to point do
- begin
- if (a[i].typ > 0) then
- begin
- inc(count);
- if (start = 0) then
- start := i;
- end;
- if (a[i].typ < 0) then
- dec(count);
- if (count = 0) then
- angle := angle + (a[i].x - a[start].x);
- end;
- angle := 2 * pi - angle;
- answer := (angle / 2) * (sqr(pr2) - sqr(pr1));
- Writeln(answer: 0: 7);
- end.
Add Comment
Please, Sign In to add comment