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]); }
void GetUse(int l, int r) { int M = (l + r) / 2; if (l <= M - 1) { GetUse(l, M - 1); } if (M + 1 <= r) { GetUse(M + 1, r); } { ConvexHullTrick Con = ConL(l, M); long max = -1000000000; for (int i = r; i >= M; i--) { max = Math.Max(max, Con.Query(-i) + UseConL(i) + (i == N - 1 ? 0 : DPR[i + 1])); use[i] = Math.Max(max, use[i]); } } { ConvexHullTrick Con = ConR(M, r); long max = -1000000000; for (int i = l; i <= M; i++) { max = Math.Max(max, Con.Query(-(N - 1 - i)) + UseConR(i) + (i == 0 ? 0 : DPL[i - 1])); use[i] = Math.Max(max, use[i]); } } }
ConvexHullTrick ConL(int l, int r) { ConvexHullTrick Con = new ConvexHullTrick(r - l + 1); for (int i = l; i <= r; i++) { if (i == 0) { Con.Add(-1, 1); } else { Con.Add(i - 1, DPL[i - 1] + sumL[i - 1] + (long)(i - 1) * (long)(i - 2) / 2); } } return(Con); }
ConvexHullTrick ConR(int l, int r) { ConvexHullTrick Con = new ConvexHullTrick(r - l + 1); for (int i = N - 1 - r; i < N - l; i++) { if (i == 0) { Con.Add(-1, 1); } else { Con.Add(i - 1, DPR[N - i] + sumR[i - 1] + (long)(i - 1) * (long)(i - 2) / 2); } } return(Con); }
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]); } }
void Calc() { int H = re.i(); int W = re.i(); long[,] MaxH = new long[H + 1, H + 1]; long[] sumH = new long[H + 1]; for (int i = 1; i <= H; i++) { sumH[i] = sumH[i - 1] + re.i(); } for (int i = 0; i <= H; i++) { for (int j = 1; j <= H; j++) { MaxH[i, j] = -10000000000000; } } MaxH[0, 0] = 0; for (int i = 1; i <= H; i++) { for (int j = 1; j <= i; j++) { MaxH[i, j] = Math.Max(MaxH[i - 1, j], sumH[i] - sumH[i - j]); } } long[,] MaxW = new long[W + 1, W + 1]; long[] sumW = new long[W + 1]; for (int i = 1; i <= W; i++) { sumW[i] = sumW[i - 1] + re.i(); } for (int i = 0; i <= W; i++) { for (int j = 1; j <= W; j++) { MaxW[i, j] = -10000000000000; } } for (int i = 1; i <= W; i++) { for (int j = 1; j <= i; j++) { MaxW[i, j] = Math.Max(MaxW[i - 1, j], sumW[i] - sumW[i - j]); } } int Q = re.i(); for (int query = 0; query < Q; query++) { int h = re.i(); int w = re.i(); ConvexHullTrick Hull = new ConvexHullTrick(w); for (int w0 = 1; w0 <= w; w0++) { Hull.Add(w0, MaxW[w, w0]); } long max = -200000; for (int h0 = 1; h0 <= h; h0++) { max = Math.Max(max, Hull.Query(h0, MaxH[h, h0])); } sb.Append(max + "\n"); } }
void Calc() { N = int.Parse(Console.ReadLine()); string[] str = Console.ReadLine().Split(' '); long[] T = new long[N]; for (int i = 0; i < N; i++) { T[i] = int.Parse(str[i]); } DPL = new long[N]; DPR = new long[N]; { sumL = new long[N]; sumL[0] = T[0]; for (int i = 1; i < N; i++) { sumL[i] = sumL[i - 1] + T[i]; } ConvexHullTrick Con = new ConvexHullTrick(N + 1); Con.Add(-1, 1); for (int i = 0; i < N; i++) { DPL[i] = Math.Max(i == 0 ? 0 : DPL[i - 1], Con.Query(-i) - sumL[i] + (long)i * (long)(i + 1) / 2); Con.Add(i, DPL[i] + sumL[i] + (long)i * (long)(i - 1) / 2); } } { sumR = new long[N]; sumR[0] = T[N - 1]; for (int i = 1; i < N; i++) { sumR[i] = sumR[i - 1] + T[N - 1 - i]; } ConvexHullTrick Con = new ConvexHullTrick(N + 1); Con.Add(-1, 1); for (int i = 0; i < N; i++) { DPR[N - 1 - i] = Math.Max(i == 0 ? 0 : DPR[N - i], Con.Query(-i) - sumR[i] + (long)i * (long)(i + 1) / 2); Con.Add(i, DPR[N - 1 - i] + sumR[i] + (long)i * (long)(i - 1) / 2); } } unuse = new long[N]; for (int i = 0; i < N; i++) { unuse[i] = (i == 0 ? 0 : DPL[i - 1]) + (i == N - 1 ? 0 : DPR[i + 1]); } use = new long[N]; for (int i = 0; i < N; i++) { use[i] = -T[i]; } GetUse(0, N - 1); int M = int.Parse(Console.ReadLine()); for (int i = 0; i < M; i++) { str = Console.ReadLine().Split(' '); int P = int.Parse(str[0]) - 1; long X = int.Parse(str[1]); sb.Append(Math.Max(unuse[P], use[P] - X + T[P]) + "\n"); } }