Guest User

Untitled

a guest
May 22nd, 2018
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 2.51 KB | None | 0 0
  1. program g2;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.   SysUtils,
  7.   Math;
  8.  
  9. const
  10.   eps = 1e-10;
  11.  
  12. type
  13.   TEvent = record
  14.     x: Extended;
  15.     typ: Integer;
  16.   end;
  17.  
  18. var
  19.   a: array [1..100000] of TEvent;
  20.   i, n, point, count, start: Integer;
  21.   r1, r2, pr1, pr2, fi1, fi2: Extended;
  22.   angle, answer: Extended;
  23.  
  24.  
  25. procedure sort(l, r: Integer);
  26. var
  27.   i, j: Integer;
  28.   x, w: TEvent;
  29.  
  30.   function less(x, y: TEvent): Boolean;
  31.   begin
  32.     Result := (x.x < y.x - eps) or (IsZero(x.x - y.x, eps) and (x.typ < y.typ));
  33.   end;
  34.  
  35. begin
  36.   i := l;
  37.   j := r;
  38.   x := a[(l + r) div 2];
  39.   repeat
  40.     while less(a[i], x) do inc(i);
  41.     while less(x, a[i]) do dec(j);
  42.     if (i <= j) then
  43.     begin
  44.       w := a[i];
  45.       a[i] := a[j];
  46.       a[j] := w;
  47.       inc(i);
  48.       dec(j);
  49.     end;
  50.   until (i > j);
  51.   if (i < r) then sort(i, r);
  52.   if (l < j) then sort(l, j);
  53. end;
  54.  
  55. procedure intersect(var rr1, rr2: Extended; r1, r2: Extended);
  56. begin
  57.   if (r1 > rr2 - eps) or (rr1 > r2 - eps) then
  58.   begin
  59.     rr1 := 0;
  60.     rr2 := 0;
  61.     Exit;
  62.   end;
  63.  
  64.   if (rr1 < r1 + eps) and (rr2 > r2 - eps) then
  65.   begin
  66.     rr1 := r1;
  67.     rr2 := r2;
  68.   end;
  69.   if (r1 < rr1 + eps) and (r2 > rr2 - eps) then
  70.   begin
  71.     rr1 := rr1;
  72.     rr2 := rr2;
  73.   end;
  74.   if (rr1 > r1 - eps) and (rr2 > rr2 - eps) then
  75.   begin
  76.     rr1 := rr1;
  77.     rr2 := r2;
  78.   end;
  79.   if (r1 > rr1 - eps) and (r2 > rr2 - eps) then
  80.   begin
  81.     rr1 := r1;
  82.     rr2 := rr2;
  83.   end;
  84.  
  85. end;
  86.  
  87. procedure add(a1, a2: Extended);
  88. begin
  89.   if (a1 > a2 + eps) then
  90.   begin
  91.     add(a1, 2 * pi);
  92.     add(0, a2);
  93.     Exit;
  94.   end;
  95.   inc(point);
  96.   a[point].x := a1;
  97.   a[point].typ := 1;
  98.  
  99.   inc(point);
  100.   a[point].x := a2;
  101.   a[point].typ := -1;
  102. end;
  103.  
  104. begin
  105.   reset(input, 'input.txt');
  106.   rewrite(output, 'output.txt');
  107.  
  108.   Readln(n);
  109.   Readln(pr1, pr2, fi1, fi2);
  110.   add(fi2, fi1);
  111.   for i := 1 to n do
  112.   begin
  113.     Readln(r1, r2, fi1, fi2);
  114.     intersect(pr1, pr2, r1, r2);
  115.     if IsZero(r1, eps) and IsZero(r2, eps) then
  116.     begin
  117.       Writeln(0);
  118.       Halt(0);
  119.     end;
  120.     add(fi2, fi1);
  121.   end;
  122.  
  123.   sort(1, point);
  124.  
  125.   count := 0;
  126.   angle := 0;
  127.   start := 0;
  128.  
  129.   for i := 1 to point do
  130.   begin
  131.     if (a[i].typ > 0) then
  132.     begin
  133.       inc(count);
  134.       if (start = 0) then
  135.         start := i;
  136.     end;
  137.     if (a[i].typ < 0) then
  138.       dec(count);
  139.  
  140.     if (count = 0) then
  141.       angle := angle + (a[i].x - a[start].x);
  142.   end;
  143.  
  144.   angle := 2 * pi - angle;
  145.  
  146.   answer := (angle / 2) * (sqr(pr2) - sqr(pr1));
  147.  
  148.   Writeln(answer: 0: 7);
  149.  
  150. end.
Add Comment
Please, Sign In to add comment