Блог пользователя SEFI2

Автор SEFI2, 10 лет назад, По-русски

Всем привет , не могу придумать алгоритм решения для этой задачи( задача А ). Думал бинарный поиск по ответу , но не смог правильно реализовать. Помогите решить. Спасибо.

  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

»
10 лет назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

На первый взгляд — более-менее стандартная модификация популярной задачи на дерево отрезков.

Посчитаем для каждой шахты два дополнительных параметра, Х и Y. Х будет равным сумме энергий всех шахт на префиксе до этой шахты, минус позиция этой шахты. Т.е, условно говоря, "баланс" шахты — сколько энергии будет в запасе/не будет хватать, если взять все шахты от самой левой и до этой включительно. Y — сумма золота по всем шахтам не правее текущей. Сожмем все значения Х и построим по ним дерево отрезков для Y.

Теперь будем идти справа налево и перебирать возможную позицию первой шахты в отрезке, который мы берем. Пускай мы зафиксировали эту шахту L и перебираем другой конец отрезка (обозначим эту шахту R). Чем отличается отрезок L..R от отрезка 1..R? Его длина короче на позицию L, сумма золота на нем меньше на сумму золота на префиксе 1..L-1, сумма энергии на нем меньше на сумму энергии на префиксе 1..L-1. Можно заметить, что эти значения не зависят от выбора R. Поэтому можно перейти к какому-то новому ограничению (вместо Energy>=Length -> EnergyPref-C1>=Position-C2), где С1 и С2 зависят от L. Теперь можно использовать функцию Х, которую мы определили выше — именно по ней можно определить хорошие/плохие R для фиксированного L. У всех таких шахт X>=Some_Value, и среди них нужно выбрать ту, у которой значение количества золота на префиксе максимально. Получаем обычную задачу на запрос максимума на отрезке (ведь мы чуть раньше построили массив, где для каждого возможного значения Х храним лучшее возможное значение Y), которую можно решать быстрее наивного перебора, воспользовавшись какой-нибудь структурой данных. Так как отрезок — это суффикс, то можно обойтись даже Фенвиком.

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится -31 Проголосовать: не нравится

    Спрячь под спойлер. Не стоит портить автору удовольствие от самостоятельного решения задачи. Или я один тут такой? :)

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится +31 Проголосовать: не нравится

      Помогите решить задачу; только, пожалуйста, не помогайте, я хочу самостоятельно решить...

      Как-то так?:) Да, мне не понять:)

      Если у человека на самом деле какие-то странные вкусы и пожелания, и он хочет, чтобы ему чуть-чуть подсказали, в каком конкретно направлении думать, но не рассказали все решение — он прочтет начало моего сообщения, и остановится на этом:)

      Для меня это как-то более логично, чем написать построй дерево отрезков и найди максимум, и потом отвечать на комментарии автора или посторонних пользователей вида Можно подробнее, какое ДО, какой максимум, как построить?

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Я решал бинпоиском по ответу, объяснять не могу, так как не помню решение в деталях, но код есть.