Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {$MODE OBJFPC}
- {$R-, Q-}
- {$M 10000111}
- uses math;
- const
- fin = '';
- fou = '';
- MAXN = 10101;
- oo = 1000111000;
- type
- pnode = ^tnode;
- tnode = record
- v : longint;
- next : pnode;
- end;
- var
- c, t : array[1..MAXN] of longint;
- //adj : array[1..MAXN, 1..MAXN] of longint;
- maxt : longint;
- cur, cc : longint;
- matchx, matchy, free : array[1..MAXN] of longint;
- a : array[1..MAXN] of pnode;
- n : longint;
- res : longint;
- function find(u:longint) : boolean;
- var
- v : longint;
- p : pnode;
- begin
- free[u] := cur;
- p := a[u];
- while (p <> nil) do
- begin
- v := p^.v;
- if (matchy[v]=0) or ((free[matchy[v]]<>cur) and (find(matchy[v]))) then
- begin
- matchx[u] := v;
- matchy[v] := u;
- exit(true);
- end;
- p := p^.next;
- end;
- exit(false);
- end;
- procedure disp(p:pnode);
- begin
- if (p = nil) then exit;
- disp(p^.next);
- dispose(p);
- end;
- procedure add(u,v:longint);
- var
- p : pnode;
- begin
- new(p);
- p^.v := v;
- p^.next := a[u];
- a[u] := p;
- end;
- function buildGraph : boolean;
- var
- i, j : longint;
- flag : boolean;
- begin
- for i:=1 to n do
- begin
- disp(a[i]);
- a[i] := nil;
- end;
- for i:=1 to n do
- begin
- flag := false;
- for j:=1 to n do
- if (abs(c[i]-j)*t[i] <= cc) then
- begin
- flag := true;
- add(i,j);
- end;
- if (not flag) then exit(false);
- end;
- exit(true);
- end;
- function check : boolean;
- var
- i, j : longint;
- temp : boolean;
- begin
- temp := buildGraph;
- if (not temp) then exit(false);
- fillchar(free,sizeof(free),0);
- fillchar(matchx,sizeof(matchx),0);
- fillchar(matchy,sizeof(matchy),0);
- for i:=1 to n do
- begin
- cur := i;
- if (not find(i)) then exit(false);
- end;
- exit(true);
- end;
- procedure solve;
- var
- low, high, mid : longint;
- begin
- low := 0;
- high := maxt;// * n;
- while (low <= high) do
- begin
- mid := (low + high) div 2;
- cc := mid;
- if (check) then
- begin
- res := cc;
- high := mid - 1;
- end
- else
- low := mid + 1;
- end;
- end;
- var
- i : longint;
- BEGIN
- assign(input,fin); reset(input);
- readln(n);
- maxt := 0;
- for i:=1 to n do
- begin
- readln(c[i],t[i]);
- maxt := max(maxt, t[i] * max(c[i]-1,n-c[i]));
- // maxt := max(maxt,t[i]);
- end;
- close(input);
- solve;
- assign(output,fou); rewrite(output);
- writeln(res);
- close(output);
- END.
Add Comment
Please, Sign In to add comment