Guest User

Untitled

a guest
Jun 19th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 2.45 KB | None | 0 0
  1. {$MODE OBJFPC}
  2. {$R-, Q-}
  3. {$M 10000111}
  4.  
  5. uses math;
  6.  
  7. const
  8.   fin = '';
  9.   fou = '';
  10.   MAXN = 10101;
  11.   oo = 1000111000;
  12.  
  13. type
  14.   pnode = ^tnode;
  15.   tnode = record
  16.     v : longint;
  17.     next : pnode;
  18.   end;
  19.  
  20. var
  21.   c, t : array[1..MAXN] of longint;
  22.   //adj : array[1..MAXN, 1..MAXN] of longint;
  23.   maxt : longint;
  24.   cur, cc : longint;
  25.   matchx, matchy, free : array[1..MAXN] of longint;
  26.   a : array[1..MAXN] of pnode;
  27.   n : longint;
  28.   res : longint;
  29.  
  30.  
  31. function find(u:longint) : boolean;
  32. var
  33.   v : longint;
  34.   p : pnode;
  35. begin
  36.   free[u] := cur;
  37.   p := a[u];
  38.   while (p <> nil) do
  39.   begin
  40.     v := p^.v;
  41.     if (matchy[v]=0) or ((free[matchy[v]]<>cur) and (find(matchy[v]))) then
  42.     begin
  43.       matchx[u] := v;
  44.       matchy[v] := u;
  45.       exit(true);
  46.     end;
  47.     p := p^.next;
  48.   end;
  49.   exit(false);
  50. end;
  51.  
  52. procedure disp(p:pnode);
  53. begin
  54.   if (p = nil) then exit;
  55.   disp(p^.next);
  56.   dispose(p);
  57. end;
  58.  
  59. procedure add(u,v:longint);
  60. var
  61.   p : pnode;
  62. begin
  63.   new(p);
  64.   p^.v := v;
  65.   p^.next := a[u];
  66.   a[u] := p;
  67. end;
  68.  
  69. function buildGraph : boolean;
  70. var
  71.   i, j : longint;
  72.   flag : boolean;
  73. begin
  74.   for i:=1 to n do
  75.   begin
  76.     disp(a[i]);
  77.     a[i] := nil;
  78.   end;
  79.   for i:=1 to n do
  80.   begin
  81.     flag := false;
  82.     for j:=1 to n do
  83.       if (abs(c[i]-j)*t[i] <= cc) then
  84.       begin
  85.         flag := true;
  86.         add(i,j);
  87.       end;
  88.     if (not flag) then exit(false);
  89.   end;
  90.   exit(true);
  91. end;
  92.  
  93. function check : boolean;
  94. var
  95.   i, j : longint;
  96.   temp : boolean;
  97. begin
  98.   temp := buildGraph;
  99.  
  100.   if (not temp) then exit(false);
  101.  
  102.   fillchar(free,sizeof(free),0);
  103.   fillchar(matchx,sizeof(matchx),0);
  104.   fillchar(matchy,sizeof(matchy),0);
  105.   for i:=1 to n do
  106.   begin
  107.     cur := i;
  108.     if (not find(i)) then exit(false);
  109.   end;
  110.   exit(true);
  111. end;
  112.  
  113. procedure solve;
  114. var
  115.   low, high, mid : longint;
  116. begin
  117.   low := 0;
  118.   high := maxt;// * n;
  119.   while (low <= high) do
  120.   begin
  121.     mid := (low + high) div 2;
  122.     cc := mid;
  123.     if (check) then
  124.     begin
  125.       res := cc;
  126.       high := mid - 1;
  127.     end
  128.     else
  129.       low := mid + 1;
  130.   end;
  131. end;
  132.  
  133. var
  134.   i : longint;
  135.  
  136. BEGIN
  137.   assign(input,fin); reset(input);
  138.     readln(n);
  139.     maxt := 0;
  140.     for i:=1 to n do
  141.     begin
  142.       readln(c[i],t[i]);
  143.       maxt := max(maxt, t[i] * max(c[i]-1,n-c[i]));
  144. //      maxt := max(maxt,t[i]);
  145.     end;
  146.   close(input);
  147.  
  148.   solve;
  149.  
  150.   assign(output,fou); rewrite(output);
  151.     writeln(res);
  152.   close(output);
  153. END.
Add Comment
Please, Sign In to add comment