Exemplo n.º 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]);
        }
Exemplo n.º 2
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]);
        }
Exemplo n.º 3
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]);
            }
        }