Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var
- a, b: array[1..1000] of int64;
- n, w : integer;
- dp, f : array[1..1000] of integer;
- ans : integer;
- procedure ReadInput();
- var i : integer;
- begin
- readln(n, w);
- for i := 1 to n do
- begin
- read(a[i], b[i]);
- end;
- end;
- function max(a, b : integer) : integer;
- begin
- if a > b then max := a
- else max := b;
- end;
- procedure Find_LIS();
- var i, j : integer;
- begin
- for i := 1 to n do
- begin
- dp[i] := 1;
- for j := 1 to i - 1 do
- if a[i] * b[j] > a[j] * b[i] then
- dp[i] := max(dp[i], dp[j] + 1);
- end;
- for i := n downto 1 do
- begin
- f[i] := 1;
- for j := n downto i + 1 do
- if a[i] * b[j] < a[j] * b[i] then
- f[i] := max(f[i], f[j] + 1);
- end;
- end;
- procedure Main_idea();
- var i, j, tmp, cur1, cur2: integer;
- begin
- ans := 0;
- for i := 1 to n do
- begin
- ans := max(ans, dp[i]);
- if w <> 0 then
- begin
- tmp := a[i];
- a[i] := b[i];
- b[i] := tmp;
- cur1 := 0;
- cur2 := 0;
- for j := 1 to i - 1 do
- if a[i] * b[j] > a[j] * b[i] then
- cur1 := max(cur1, dp[j]);
- for j := i + 1 to n do
- if a[i] * b[j] < a[j] * b[i] then
- cur2 := max(cur2, f[j]);
- ans := max(ans, cur1 + cur2 + 1);
- tmp := a[i];
- a[i] := b[i];
- b[i] := tmp
- end;
- end;
- end;
- procedure Print();
- begin
- write(ans);
- readln;
- end;
- BEGIN
- ReadInput();
- Find_LIS();
- Main_idea();
- Print();
- END.
Advertisement
Add Comment
Please, Sign In to add comment