static void Main(string[] args) { int n = int.Parse(Console.ReadLine()); int[] a = new int[n + 1]; int[] b = new int[n + 1]; long[] dp = new long[n + 1]; int[] tmp = Array.ConvertAll(Console.ReadLine().Split(), int.Parse); for (int i = 1; i <= n; i++) { a[i] = tmp[i - 1]; } tmp = Array.ConvertAll(Console.ReadLine().Split(), int.Parse); for (int i = 1; i <= n; i++) { b[i] = tmp[i - 1]; } ConvexHullTrick cht = new ConvexHullTrick(n); dp[1] = a[1] * b[1]; cht.add(new line(b[1], 0)); for (int i = 2; i <= n; ++i) { dp[i] = cht.query(a[i]); cht.add(new line(b[i], dp[i])); } Console.WriteLine(dp[n]); }
static void Main(string[] args) { int N = int.Parse(Console.ReadLine()); Tuple <int, int>[] a = new Tuple <int, int> [N]; Tuple <int, int>[] rect = new Tuple <int, int> [N]; for (int i = 0; i < N; ++i) { string[] data = Console.ReadLine().Split(); a[i] = new Tuple <int, int>(int.Parse(data[0]), int.Parse(data[1])); } Array.Sort(a); int len = 0; for (int i = 0; i < N; ++i) { while (len > 0 && rect[len - 1].Item2 <= a[i].Item2) { --len; } rect[len++] = a[i]; } long[] cost = new long[len + 1]; cost[0] = 0; ConvexHullTrick cht = new ConvexHullTrick(len); cht.add(new line(rect[0].Item2, cost[0])); for (int i = 0; i < len; ++i) { cost[i + 1] = cht.query(rect[i].Item1); if (i < len - 1) { cht.add(new line(rect[i + 1].Item2, cost[i + 1])); } } Console.WriteLine(cost[len]); }
static void Main(string[] args) { int T = int.Parse(Console.ReadLine()); while (T-- > 0) { int n = int.Parse(Console.ReadLine()); long[] x = new long[n + 1]; long[] sum = new long[n + 1]; long[] dp = new long[n + 1]; string[] data = Console.ReadLine().Split(); int a = int.Parse(data[0]); int b = int.Parse(data[1]); int c = int.Parse(data[2]); data = Console.ReadLine().Split(); for (int i = 1; i <= n; ++i) { x[i] = long.Parse(data[i - 1]); sum[i] = sum[i - 1] + x[i]; } ConvexHullTrick cht = new ConvexHullTrick(n); dp[1] = a * sq(x[1]) + b * x[1] + c; cht.add(new line(-2 * a * sum[1], dp[1] + a * sq(sum[1]) - b * sum[1])); for (int i = 2; i <= n; ++i) { dp[i] = a * sq(sum[i]) + b * sum[i] + c; dp[i] = Math.Max(dp[i], dp[i] + cht.query(sum[i])); cht.add(new line(-2 * a * sum[i], dp[i] + a * sq(sum[i]) - b * sum[i])); } Console.WriteLine(dp[n]); } }