Rodionno's blog

By Rodionno, history, 21 month(s) ago, In Russian

Есть интересная задача (скорее всего хорошо известная), но к сожалению все, у кого я спрашивал, не знают как делать её быстрее чем за O(n ^ 2). Помогите бедному скатившемуся синему.

Задача: есть массив из целых чисел, надо найти отрезок [l, r] где величина sum(l, r) * len(l, r) будет максимальна. sum(l, r)= a[l] + a[l + 1] + ... + a[r], len(l, r) = r — l + 1. 1 <= n <= 10^5, -10^9 <= a[i] <= 10^9.

Ограничения могут быть и менее строгими, если существует какое-то быстрое и интересное решение.

Возможно это решается чем-то вроде кхт. Можно попробовать взять отрезок с наибольшей суммой и расширить его. Можно свести задачу к точкам на плоскости, где надо выбрать прямоугольник с наибольшей площадью, при чём левый нижний и верхний правый угол должны быть в одной из данных точек.

  • Vote: I like it
  • +22
  • Vote: I do not like it

»
21 month(s) ago, # |
  Vote: I like it 0 Vote: I do not like it

Here is the solution: link

Instead of convex hull trick, you can use lichao tree for simplier (?) implementation, but with time complexity $$$O(n\log n \log C)$$$.

  • »
    »
    21 month(s) ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Thank you, it's strange that i couldn't find this blog myself.