module Main; import CPLib.IO; // import BinaryHeap; // import BoolArray; // import CPLib.Arithmetic; // import CPLib.Bipartite; // import CPLib.Bits; // import CPLib.Convolution; // import CPLib.DSegtree; // import CPLib.Graph; // import CPLib.LDSegtree; // import CPLib.LSegtree; // import CPLib.MaxFlow; // import CPLib.Memoize; // import CPLib.MinCostFlow; // import CPLib.Misc; // import CPLib.Monoid; // import CPLib.Segtree; // import CPLib.String; // import CPLib.Trait; // import CPLib.TwoSat; // import CPLib.UnionFind; // import CPLib.ZP; // import HashMap; // import HashSet; main : IO () = ( let iN = *read_i; let iabs = *range(0, iN).fold_m([], |_, iabs| let a = *read_i; let b = *read_i; iabs.push_back((a, b)).pure ); let iabs = iabs.sort_by(|(lhs, rhs)| lhs.@1 > rhs.@1 ); let free_cnt = iN / 3; let dp = fill(iN+1, fill(free_cnt + 1, I64::maximum / 2)); let dp = range(0, iN+1).fold(dp, |n, dp| range(0, free_cnt+1).fold(dp, |m, dp| let v = ( if m > n { I64::maximum / 2 }; if n == m { 0 }; // freeでもらった場合 let v0 = if m > 0 { dp[n-1][m-1].iget } else { I64::maximum / 2 }; // かう場合 let w = n - m - 1; let v1 = dp[n-1][m].iget + w * iabs.@(n-1).@1 + iabs.@(n-1).@0; min(v0, v1) ); dp[n][m].iset(v) ) ); let ans = dp[iN][free_cnt].iget; ans.to_string.println;; pure() );