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

Автор Sergio86, история, 9 месяцев назад, По-русски

На занятиях Дима получил массив из N чисел, на котором он должен сделать Q запросов. Каждый запрос состоит из двух целых чисел L и R. Ответом на запрос служит сумма чисел с индексами от L до R включительно в исходном массиве.

Дима заметил, что уровень его радости от процесса вычислений напрямую зависит от суммарного значения всех ответов на запросы. Учитывая то, что Дима может изменить порядок элементов в массиве произвольным образом, он захотел вычислить значение максимально возможной суммы результатов всех запросов, которую он может получить таким образом.

Помогите вычислить Диме это значение!

Входные данные Первая строка входного файла INPUT.TXT содержит два целых числа N и Q (1 ≤ N, Q ≤ 10^5).

Во второй строке находится N целых чисел Ai, задающих элементы массива (1 ≤ Ai ≤10^8).

В последующих Q строках находятся пары чисел L и R (1 ≤ L ≤ R ≤ N), обозначающие границы отрезка, на котором нужно вычислять сумму элементов.

Выходные данные В единственной строке выходного файла OUTPUT.TXT выведите единственное целое число – максимально возможную сумму результатов всех запросов, которую Дима может получить.

3 4

7 3 1

1 3 2 3 3 3 2 2

31

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

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

Посмотри на вхождение каждого индекса в каждый отрезок

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

Посчитать как в https://codeforces.net/contest/295/problem/A и отсортировать

  • »
    »
    9 месяцев назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Дело в том, что в задаче нет обновлений элементов. Необходимо найти такую расстановку элементов, чтобы сумма сумм по каждому из запросов была максимальной.

    • »
      »
      »
      9 месяцев назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Поэтому и надо отсортировать. И выше Sk0rlupka то же самое предлагает

»
9 месяцев назад, # |
Rev. 7   Проголосовать: нравится +3 Проголосовать: не нравится

Рассмотрим индекс i массива значений. Заметим, что количество раз, которое элемент с индексом i будет просуммирован к общей сумме равно количеству отрезков, содержащих этот индекс. Теперь можно сказать, что чем чаще элемент с индексом i участвует в общей сумме, тем больше должно быть его значение чтобы получить максимальную общую сумму. Осталось только реализовать:

1) Отсортируем все элементы массива значений по убыванию

2) Для каждого индекса i от 1 до N найдём количество отрезков содержащих i. Это делается, например, с помощью метода сканирующей прямой. Будем хранить результаты как пары (count; i), где count — количество отрезков содержащих i, i — сам индекс

3) Отсортируем все пары по убыванию значения count

4) Сопоставим отсортированные элементы изначального массива с индексами в отсортированных парах (то есть пусть у нас есть отсортированный массив с элементами изначального массива A и отсортированные пары pairs, рассмотрим A[j] и pairs[j], где j от 1 до N, пусть массив ans — оптимальная перестановка значений, тогда ans[pairs[j].second] = A[j])

5) Выведем ответ

Сложность решения O(n*log(n)) (Сортировка элементов массива O(n*log(n)) + Метод сканирующей прямой O(n(log(n)) (так как в нём тоже используется сортировка получаем O(n*log(n)))