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