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

Автор onexgol, история, 5 часов назад, По-русски

Дан массив пар v длины n, где v[i] = {a, b}, a <= b. Так же дано q запросов l, r. Необходимо посчитать количество элементов на отрезке v[l, r], таких, что l <= v[i].a <= v[i].b <= r.

n <= 10^5, q <= 10^5

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

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

Автокомментарий: текст был обновлен пользователем onexgol (предыдущая версия, новая версия, сравнить).

»
44 минуты назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Заметим, что ответ на запрос (l, r) = (размер отрезка) — (количество неподходящих элементов)

где bad = cnt(a.r > r) + cnt(a.l < l) - cnt(a.r > r && a.l < l)

Первые 2 слагаемых хорошие, третье сложное, от него надо избавиться.

Условие a.r > r && a.l < l влечёт a.r - a.l > r - l.
Значит, если для элемента выполняется a.r - a.l <= r - l, то он не может попасть в третье слагаемое.

Чтобы исключить третье слагаемое:

  • Отсортируем все запросы по возрастанию r - l.
  • Перед ответом на очередной запрос (l, r) добавим в структуру данных все ещё не добавленные элементы, у которых a[i].r - a[i].l < r - l.

Теперь для каждого запроса нужно вычислить только: cnt(a.l < l) + cnt(a.r > r) на отрезке [l, r] среди добавленных элементов.

Эту задачу умеет решать Merge‑sort Tree, но с модификацией: вместо массивов в узлах храним Декартово дерево (Treap), чтобы поддерживать динамическое добавление элементов.

  • Добавление одного элемента: O(log^2 n)
  • Ответ на запрос: O(log^2 n)
  • Итого: O((n + q) log^2 n)
  • »
    »
    32 минуты назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится

    Дипсик кстати решил круче, у него nlogn и код легче. Думаю мне сюда его решение не надо кидать, все сами справятся сделать промпт