Advertisement
agul

MCCME 3581

Feb 9th, 2012
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 1.67 KB | None | 0 0
  1. {$APPTYPE CONSOLE}
  2. {$R+,S+,Q+,I+,C+,M+,H+,O+}
  3. {R+,S-,Q+,I-,C-,M-,H-,O+}
  4.  
  5. uses
  6.     SysUtils, Math;
  7.  
  8. var
  9.     i, qq : longint;
  10.     n, q, s, f, ls, lf : int64;
  11.     x, y : array[0..100010] of extended;
  12.     d, dd : array[0..100010] of extended;
  13.     p : array[0..100010, 1..2] of extended;
  14.     ans, ys, yf : extended;
  15.  
  16. function dst(y1, y2 : extended) : extended;
  17. begin
  18.     result := max(y2 - y1, 0);
  19. end;
  20.  
  21. function find(xx : int64) : int64;
  22.  
  23. var
  24.     l, r, c : int64;
  25.  
  26. begin
  27.     l := 1;
  28.     r := n;
  29.     while r - l > 1 do begin
  30.         c := (l + r) shr 1;
  31.         if x[c] > xx then r := c else l := c;
  32.     end;
  33.     if x[r] <= xx then result := r else result := l;
  34. end;
  35.  
  36. function getY(l : int64; x : extended) : extended;
  37. begin
  38.     if l > n then result := y[n] else result := p[l][1] * x + p[l][2];
  39. end;
  40.  
  41. begin
  42.     reset(input, 'input.txt');
  43.     rewrite(output, 'output.txt');
  44.     read(n);
  45.     for i := 1 to n do
  46.         read(x[i], y[i]);
  47.     x[n + 1] := x[n] + 10;
  48.     y[n + 1] := y[n] + 10;
  49.     d[1] := 0;
  50.     for i := 2 to n do begin
  51.         d[i] := d[i - 1] + dst(y[i - 1], y[i]);
  52.         p[i][1] := (y[i] - y[i - 1]) / (x[i] - x[i - 1]);
  53.         p[i][2] := (y[i - 1] * x[i] - x[i - 1] * y[i]) / (x[i] - x[i - 1]);
  54.     end;
  55.     dd[n] := 0;
  56.     for i := n - 1 downto 1 do
  57.         dd[i] := dd[i + 1] + dst(y[i + 1], y[i]);
  58.     read(q);
  59.     for qq := 1 to q do begin
  60.         read(s, f);  
  61.         ls := find(s);
  62.         lf := find(f);
  63.         ys := getY(ls + 1, s);
  64.         yf := getY(lf + 1, f);
  65.         if s = f then ans := 0 else
  66.         if s < f then
  67.             if ls = lf then ans := dst(ys, yf) else ans := d[lf] - d[ls + 1] + dst(ys, y[ls + 1]) + dst(y[lf], yf)
  68.         else
  69.       if ls = lf then ans := dst(ys, yf) else ans := dd[lf + 1] - dd[ls] + dst(ys, y[ls]) + dst(y[lf + 1], yf);
  70.         writeln(ans:0:16);
  71.     end;
  72. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement