Exemplo n.º 1
0
    void GetUse(int l, int r)
    {
        int M = (l + r) / 2;

        if (l <= M - 1)
        {
            GetUse(l, M - 1);
        }
        if (M + 1 <= r)
        {
            GetUse(M + 1, r);
        }
        {
            ConvexHullTrick Con = ConL(l, M);
            long            max = -1000000000;
            for (int i = r; i >= M; i--)
            {
                max    = Math.Max(max, Con.Query(-i) + UseConL(i) + (i == N - 1 ? 0 : DPR[i + 1]));
                use[i] = Math.Max(max, use[i]);
            }
        }
        {
            ConvexHullTrick Con = ConR(M, r);
            long            max = -1000000000;
            for (int i = l; i <= M; i++)
            {
                max    = Math.Max(max, Con.Query(-(N - 1 - i)) + UseConR(i) + (i == 0 ? 0 : DPL[i - 1]));
                use[i] = Math.Max(max, use[i]);
            }
        }
    }
Exemplo n.º 2
0
    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");
        }
    }
Exemplo n.º 3
0
    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");
        }
    }