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); }
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"); } }