long solve(int n, long L, long[] a, long[] b) { var ret = 0L; var v = 0L; var cum = new long[n + 1]; for (int i = 0; i < n; i++) { cum[i + 1] = cum[i] + b[i]; } for (int i = 1; i <= n; i++) { cum[i] -= a[i - 1]; } var rmq = new RMQ(n + 1); for (int i = 0; i <= n; i++) { rmq.Update(i, cum[i]); } for (int i = 0; i <= n; i++) { var u = 0L; if (i != 0) { v += b[n - i]; u -= 2 * (L - a[n - i]); } u += v; u += rmq.Query(0, n - i + 1); ret = Math.Max(ret, u); Debug.WriteLine(u); } return(ret); }
void Solve() { int N = cin.Nextint; var A = new Pair[N]; for (int i = 0; i < N; i++) { A[i] = new Pair(cin.Nextint, cin.Nextint - 1); } A = A.OrderBy(i => i.Key).ThenByDescending(i => i.Value).ToArray(); int n = 1; while (n < MAX) { n *= 2; } var B = new RMQ(n); for (int i = 0; i < N; i++) { B.Update(A[i].Value, B.Query(0, A[i].Value, 0, 0, n) + 1); } WriteLine(B.Query(0, n, 0, 0, n)); }
void Solve() { N = F(); var c = new int[N]; var a = new int[N]; for (var i = 1; i < N; i++) { var I = G(); c[i] = I[0]; a[i] = I[1]; } var s = new RMQ(N); s[0] = 0; for (var i = 1; i < N; i++) { s[i] = -1; } var grundy = new int[N]; var sum = 0; for (var i = 1; i < N; i++) { grundy[i] = FirstBinary(0, N, j => s.Min(0, j) < i - c[i]) - 1; s[grundy[i]] = i; if (a[i] % 2 == 1) { sum ^= grundy[i]; } } Console.WriteLine(sum != 0 ? "First" : "Second"); }
public void TestForMin() { int[] a = { 1, 3, 2, -1, 4 }; Func func = Program.FindMin; RMQ rmq = new RMQ(a, func, true); Assert.AreEqual(-1, rmq.Q(0, 0, a.Length - 1)); Assert.AreEqual(-1, rmq.Q(0, 2, a.Length - 1)); Assert.AreEqual(1, rmq.Q(0, 0, a.Length - 3)); }
public void TestForSum() { int[] a = { 1, 3, 2, -1, 4 }; Func func = Program.FindSum; RMQ rmq = new RMQ(a, func, true); Assert.AreEqual(9, rmq.Q(0, 0, a.Length - 1)); Assert.AreEqual(5, rmq.Q(0, 2, a.Length - 1)); Assert.AreEqual(6, rmq.Q(0, 0, a.Length - 3)); }
void Solve() { N = cin.Nextint; P = cin.Scanint; B = new int[200001]; for (int i = 0; i < N; i++) { B[P[i]] = i; } n = 1; while (n < N) { n *= 2; } R = new RMQ(n); L = new RMQ(n); for (int i = 0; i < N; i++) { if (i % 2 == 0) { R.update(i, P[i]); } else { L.update(i, P[i]); } } var G = new PriorityQueue <Edge>(); G.Enqueue(new Edge(0, N, R.query(0, N, 0, 0, n))); while (G.Any()) { var v = G.Dequeue(); if (v.a == v.b) { continue; } int max = v.min; int s = B[max]; int right = calc(s + 1, v.b); int t = B[right]; Write($"{max} {right} "); G.Enqueue(new Edge(v.a, s, calc(v.a, s))); G.Enqueue(new Edge(s + 1, t, calc(s + 1, t))); G.Enqueue(new Edge(t + 1, v.b, calc(t + 1, v.b))); } WriteLine(); }