public static void Main() { var nk = Console.ReadLine().Split().Select(int.Parse).ToArray(); var n = nk[0]; var k = nk[1]; var p = Console.ReadLine().Split().Select(int.Parse).ToArray(); long res = 1; DisjointSparseTable <Incr> isIncr = new DisjointSparseTable <Incr>(p.Select(x => new Incr() { L = x, R = x, Valid = true }).ToArray(), Incr.Merge); DisjointSparseTable <int> rmin = new DisjointSparseTable <int>(p, Min); DisjointSparseTable <int> rmax = new DisjointSparseTable <int>(p, Max); long incrCount = isIncr.Query(0, k - 1).Valid ? 1 : 0; for (int i = 1; i <= n - k; i++) { if (rmax.Query(i, i + k - 1) != p[i + k - 1] || rmin.Query(i - 1, i + k - 2) != p[i - 1]) { if (isIncr.Query(i, i + k - 1).Valid) { incrCount++; } res++; } } Console.WriteLine(res - (incrCount <= 1 ? 0 : incrCount - 1)); }
public static void Main() { var nk = Console.ReadLine().Split().Select(int.Parse).ToArray(); var p = Console.ReadLine().Split().Select(int.Parse).ToArray(); DisjointSparseTable <int> a = new DisjointSparseTable <int>(p, (x, y) => x + y); var max = 0; for (int i = nk[1] - 1; i < p.Length; i++) { max = Max(max, a.Query(i - nk[1] + 1, i)); } Console.WriteLine((max + nk[1]) / 2.0); }
public static void Main() { int n = int.Parse(Console.ReadLine()); var pos = Enumerable.Repeat(0, n).Select(_ => Console.ReadLine().Split().Select(long.Parse).ToArray()).Select(x => (x: x[0], y: x[1])).OrderBy(x => x.x).ToArray(); DisjointSparseTable <MinMax> dst = new DisjointSparseTable <MinMax>( pos.Select(x => new MinMax(x.y)).ToArray(), (x, y) => x | y ); // Console.WriteLine(string.Join("\n", pos)); // IsValid(805); bool IsValid(long dist) { int sectionBegin = 0; int sectionEnd = 0; while (sectionEnd < pos.Length) { while (dist <= pos[sectionEnd].x - pos[sectionBegin].x) { var q1 = dst.Query(0, sectionBegin); var q2 = dst.Query(sectionEnd, dst.Size - 1); if (Max(q1.Max - q2.Min, q2.Max - q1.Min) >= dist) { return(true); } sectionBegin++; } sectionEnd++; } return(false); } long valid = 0, invalid = int.MaxValue; while (invalid - valid > 1) { var mid = (invalid + valid) / 2; if (IsValid(mid)) { valid = mid; } else { invalid = mid; } } Console.WriteLine(valid); }
static void Solve() { var ns = Console.ReadLine().Split().Select(int.Parse).ToArray(); var n = ns[0]; var s = ns[1]; var a = Console.ReadLine().Split().Select(int.Parse).ToArray(); var accum = new long[n + 1]; for (int i = 0; i < a.Length; i++) { accum[i + 1] = accum[i] + a[i]; } DisjointSparseTable <long> dst = new DisjointSparseTable <long>(accum, Min); int mxLen = 0; int l = -1; int r = -1; for (int i = 0; i < n; i++) { int valid = i, invalid = n + 1; while (invalid - valid > 1) { var mid = (valid + invalid) / 2; if (accum[i] - s <= dst.Query(i, mid)) { valid = mid; } else { invalid = mid; } } var len = valid - i; if (mxLen < len) { mxLen = len; (l, r) = (i, valid); } } if (mxLen == 0) { Console.WriteLine(-1); } else { Console.WriteLine($"{l + 1} {r}"); } }
public static void Main() { var nt = Console.ReadLine().Split().Select(int.Parse).ToArray(); var n = nt[0]; var t = nt[1]; var a = Console.ReadLine().Split().Select(int.Parse).ToArray(); var max = 0; DisjointSparseTable <int> rangeMin = new DisjointSparseTable <int>(a, Min); DisjointSparseTable <int> rangeMax = new DisjointSparseTable <int>(a, Max); for (int i = 0; i < n; i++) { max = Max(max, a[i] - rangeMin.Query(0, i)); } var res = int.MaxValue; { var count = 0; for (int i = 0; i < n; i++) { if (a[i] + max == rangeMax.Query(i, rangeMax.Size - 1)) { count++; } } res = Min(res, count); } { var count = 0; for (int i = 0; i < n; i++) { if (a[i] - max == rangeMin.Query(0, i)) { count++; } } res = Min(res, count); } Console.WriteLine(res); }
public static void Main() { int n = int.Parse(Console.ReadLine()); var a = Console.ReadLine().Split().Select(long.Parse).ToArray(); DisjointSparseTable <long> dst = new DisjointSparseTable <long>(a, (x, y) => x + y); long totalMax = long.MinValue / 2; var totalMaxInd = (-1, -1, -1); for (int ind2 = 0; ind2 <= a.Length; ind2++) { var max1 = long.MinValue / 2; int maxInd1 = -1; for (int ind1 = 0; ind1 <= ind2; ind1++) { var cur = dst.Query(0, ind1 - 1) - dst.Query(ind1, ind2 - 1); if (max1 < cur) { max1 = cur; maxInd1 = ind1; } } var max2 = long.MinValue / 2; int maxInd3 = -1; for (int ind3 = ind2; ind3 <= a.Length; ind3++) { var cur = dst.Query(ind2, ind3 - 1) - dst.Query(ind3, n - 1); if (max2 < cur) { max2 = cur; maxInd3 = ind3; } } if (totalMax < max1 + max2) { totalMax = max1 + max2; totalMaxInd = (maxInd1, ind2, maxInd3); } } Console.WriteLine($"{totalMaxInd.Item1} {totalMaxInd.Item2} {totalMaxInd.Item3}"); }