Пример #1
0
    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));
    }
Пример #2
0
    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);
    }
Пример #3
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);
    }
Пример #4
0
    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}");
        }
    }
Пример #5
0
    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);
    }
Пример #6
0
    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}");
    }