Exemplo n.º 1
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var(n, k) = inputStream.ReadValue <int, int>();
            var a = new int[n];

            for (int i = 0; i < n; i++)
            {
                a[i] = inputStream.ReadInt() - k;
            }

            var prefixSum = new long[a.Length + 1];

            for (int i = 0; i < a.Length; i++)
            {
                prefixSum[i + 1] = prefixSum[i] + a[i];
            }

            var shrinker = new CoordinateShrinker <long>(prefixSum); // 座圧
            var bit      = new BinaryIndexedTree(shrinker.Count);

            long count = 0;

            foreach (var s in prefixSum)
            {
                count += bit.Sum(..(shrinker.Shrink(s) + 1));   // 転倒数を数える
                bit[shrinker.Shrink(s)]++;
            }

            yield return(count);
        }
Exemplo n.º 2
0
        public override void Solve(IOManager io)
        {
            const long Inf       = 1L << 60;
            var        n         = io.ReadInt();
            var        k         = io.ReadInt();
            var        h         = io.ReadIntArray(n);
            var        shrinker  = new CoordinateShrinker <int>(h.Append(0));
            var        hShrinked = new int[n];

            for (int i = 0; i < h.Length; i++)
            {
                hShrinked[i] = shrinker.Shrink(h[i]);
            }

            var dp = new long[n + 1, k + 1, shrinker.Count + 1].Fill(Inf);

            dp[0, 0, 0] = 0;

            for (int i = 0; i < hShrinked.Length; i++)
            {
                var currentH = hShrinked[i];

                for (int repainted = 0; repainted <= k; repainted++)
                {
                    for (int lastHeight = 0; lastHeight <= shrinker.Count; lastHeight++)
                    {
                        // 塗り替えない
                        if (currentH > lastHeight)
                        {
                            dp[i + 1, repainted, currentH].ChangeMin(dp[i, repainted, lastHeight] + shrinker.Expand(currentH) - shrinker.Expand(lastHeight));
                        }
                        else
                        {
                            dp[i + 1, repainted, currentH].ChangeMin(dp[i, repainted, lastHeight]);
                        }

                        // 塗り替える
                        if (repainted < k)
                        {
                            dp[i + 1, repainted + 1, lastHeight].ChangeMin(dp[i, repainted, lastHeight]);
                        }
                    }
                }
            }

            long min = Inf;

            for (int repainted = 0; repainted <= k; repainted++)
            {
                for (int lastHeight = 0; lastHeight <= shrinker.Count; lastHeight++)
                {
                    min.ChangeMin(dp[n, repainted, lastHeight]);
                }
            }

            io.WriteLine(min);
        }
Exemplo n.º 3
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var(sitesCount, queriesCount) = inputStream.ReadValue <int, int>();
            var yCoordinates = new HashSet <int>();
            var queries      = new List <Query>();
            var toAnswer     = new Queue <SumQuery>();
            var answers      = new Dictionary <SumQuery, long>();

            for (int i = 0; i < sitesCount; i++)
            {
                var(x, y, d, c) = inputStream.ReadValue <int, int, int, int>();
                yCoordinates.Add(y);
                yCoordinates.Add(y + d + 1);
                queries.Add(new AddQuery(x, y, d, c));
                queries.Add(new AddQuery(x + d + 1, y, d, -c));
            }

            for (int i = 0; i < queriesCount; i++)
            {
                var(a, b) = inputStream.ReadValue <int, int>();
                yCoordinates.Add(b);
                var query = new SumQuery(a, b);
                queries.Add(query);
                toAnswer.Enqueue(query);
            }

            queries.Sort();
            var shrinker = new CoordinateShrinker <int>(yCoordinates);
            var costs    = new BinaryIndexedTree(shrinker.Count);

            foreach (var query in queries)
            {
                var shrinkedY = shrinker.Shrink(query.Y);

                if (query is AddQuery addQuery)
                {
                    var shrinkedYPlusD = shrinker.Shrink(addQuery.Y + addQuery.Distance + 1);
                    costs.AddAt(shrinkedY, addQuery.Cost);
                    costs.AddAt(shrinkedYPlusD, -addQuery.Cost);
                }
                else if (query is SumQuery sumQuery)
                {
                    answers.Add(sumQuery, costs.Sum(shrinkedY + 1));
                }
            }

            foreach (var query in toAnswer)
            {
                yield return(answers[query]);
            }
        }
Exemplo n.º 4
0
        public override void Solve(IOManager io)
        {
            Modular.Mod = 1000000007;
            var n = io.ReadInt();
            var k = io.ReadInt();

            var numbers = new int[n][];
            var all     = new int[n * k + 1]; // include 0

            for (int i = 0; i < numbers.Length; i++)
            {
                numbers[i] = io.ReadIntArray(k);
                numbers[i].AsSpan().CopyTo(all.AsSpan(k * i));
            }

            var shrinker = new CoordinateShrinker <int>(all);

            var last = new BinaryIndexedTree(shrinker.Count);

            last[0] = 1;

            for (int i = 0; i < numbers.Length; i++)
            {
                var current = new BinaryIndexedTree(shrinker.Count);

                foreach (var value in numbers[i])
                {
                    var index = shrinker.Shrink(value);
                    current[index] = last.Sum(index + 1);
                }

                last = current;
            }

            io.WriteLine(last.Sum(last.Length));
        }