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

Автор dyussenaliyev, 13 лет назад, По-русски
Дан массив из N чисел и Q запросов.
Каждый запрос:
  • Дается два числа L, R.
  • Вывести наилучший подотрезок [i..j], где L <= i <= j <= R.
  • Один отрезок лучше другого, если сумма в нем больше.
  • При подсчёте суммы нужно учитывать повторяющиеся числа как одно число, то есть только один раз.
1 <= N <= 100000
1 <= Q <= 100000
Числа массива в промежутке [-100000, 100000]

http://www.spoj.pl/problems/GSS2/ - ссылка на саму задачу.

Пример:
Input:
9
4 -2 -2 3 -1 -4 2 2 -6
3
1 2
1 5
4 9

Output:
4
5
3
Комментарии:
1-ый запрос: подотрезок [1..1]
2-ой запрос: подотрезок [1..4]
3-ий запрос: подотрезок [4..4]

Заранее спасибо.
  • Проголосовать: нравится
  • +5
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
Это стандартная задача на дерево интервалов. В каждой вершине дерева нужно хранить наибольшую сумму на подотрезке лежащем в отрезке этой вершины и наибольшие суммы на префиксе и суффиксе отрезка вершины.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Это понятно, а как повторения учитывать?
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Можно сканирующей прямой по запросам.
      Сначала оставить только первые вхождения чисел, а после прохода какого-то числа убирать его из дерево отрезков и добавлять следующее по вхождению.
13 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

ignore