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); }
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]); } }
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); }
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)); }