示例#1
0
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());

            int[]  a  = new int[n + 1];
            int[]  b  = new int[n + 1];
            long[] dp = new long[n + 1];

            int[] tmp = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            for (int i = 1; i <= n; i++)
            {
                a[i] = tmp[i - 1];
            }
            tmp = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            for (int i = 1; i <= n; i++)
            {
                b[i] = tmp[i - 1];
            }

            ConvexHullTrick cht = new ConvexHullTrick(n);

            dp[1] = a[1] * b[1];
            cht.add(new line(b[1], 0));
            for (int i = 2; i <= n; ++i)
            {
                dp[i] = cht.query(a[i]);
                cht.add(new line(b[i], dp[i]));
            }

            Console.WriteLine(dp[n]);
        }
示例#2
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]);
            }
        }
    }
示例#3
0
    ConvexHullTrick ConL(int l, int r)
    {
        ConvexHullTrick Con = new ConvexHullTrick(r - l + 1);

        for (int i = l; i <= r; i++)
        {
            if (i == 0)
            {
                Con.Add(-1, 1);
            }
            else
            {
                Con.Add(i - 1, DPL[i - 1] + sumL[i - 1] + (long)(i - 1) * (long)(i - 2) / 2);
            }
        }
        return(Con);
    }
示例#4
0
    ConvexHullTrick ConR(int l, int r)
    {
        ConvexHullTrick Con = new ConvexHullTrick(r - l + 1);

        for (int i = N - 1 - r; i < N - l; i++)
        {
            if (i == 0)
            {
                Con.Add(-1, 1);
            }
            else
            {
                Con.Add(i - 1, DPR[N - i] + sumR[i - 1] + (long)(i - 1) * (long)(i - 2) / 2);
            }
        }
        return(Con);
    }
示例#5
0
        static void Main(string[] args)
        {
            int N = int.Parse(Console.ReadLine());

            Tuple <int, int>[] a    = new Tuple <int, int> [N];
            Tuple <int, int>[] rect = new Tuple <int, int> [N];

            for (int i = 0; i < N; ++i)
            {
                string[] data = Console.ReadLine().Split();
                a[i] = new Tuple <int, int>(int.Parse(data[0]), int.Parse(data[1]));
            }
            Array.Sort(a);

            int len = 0;

            for (int i = 0; i < N; ++i)
            {
                while (len > 0 && rect[len - 1].Item2 <= a[i].Item2)
                {
                    --len;
                }
                rect[len++] = a[i];
            }

            long[] cost = new long[len + 1];
            cost[0] = 0;
            ConvexHullTrick cht = new ConvexHullTrick(len);

            cht.add(new line(rect[0].Item2, cost[0]));

            for (int i = 0; i < len; ++i)
            {
                cost[i + 1] = cht.query(rect[i].Item1);
                if (i < len - 1)
                {
                    cht.add(new line(rect[i + 1].Item2, cost[i + 1]));
                }
            }

            Console.WriteLine(cost[len]);
        }
示例#6
0
        static void Main(string[] args)
        {
            int T = int.Parse(Console.ReadLine());

            while (T-- > 0)
            {
                int      n    = int.Parse(Console.ReadLine());
                long[]   x    = new long[n + 1];
                long[]   sum  = new long[n + 1];
                long[]   dp   = new long[n + 1];
                string[] data = Console.ReadLine().Split();
                int      a    = int.Parse(data[0]);
                int      b    = int.Parse(data[1]);
                int      c    = int.Parse(data[2]);

                data = Console.ReadLine().Split();
                for (int i = 1; i <= n; ++i)
                {
                    x[i]   = long.Parse(data[i - 1]);
                    sum[i] = sum[i - 1] + x[i];
                }

                ConvexHullTrick cht = new ConvexHullTrick(n);

                dp[1] = a * sq(x[1]) + b * x[1] + c;
                cht.add(new line(-2 * a * sum[1], dp[1] +
                                 a * sq(sum[1]) - b * sum[1]));

                for (int i = 2; i <= n; ++i)
                {
                    dp[i] = a * sq(sum[i]) + b * sum[i] + c;
                    dp[i] = Math.Max(dp[i], dp[i] + cht.query(sum[i]));
                    cht.add(new line(-2 * a * sum[i], dp[i] +
                                     a * sq(sum[i]) - b * sum[i]));
                }
                Console.WriteLine(dp[n]);
            }
        }
示例#7
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");
        }
    }
示例#8
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");
        }
    }