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

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

Задача "Магический массив" (A в div1, B в div2).

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

Поэтому решение у задачи следующее: выделим отрезки подряд идущих одинаковых чисел. Пусть длина очередного отрезка равна len. Тогда к ответу нужно добавить треугольное число len * (len + 1) / 2. Асимптотическая сложность решения O(N)

Распространённой ошибкой многих участников было использование 32-ух битного типа данных. Очевидно, что ответ на задачу пропорционален квадрату. Подсказкой служила фраза из условия, но многие оказались невнимательны.

Задача "Биатлон" (C в div2).

Отсортируем все круги относительно их центра (координаты x). Поскольку окружности не вкладывались и не пересекались (только касались), то после сортировки окружности будут идти одна за другой слева направо.

Теперь будет по очереди отвечать на запросы. Пусть координаты очередного точки (x, y). Теперь давайте поймем, в какие окружности этот выстрел мог попасть. Если посмотреть только на координату x этой точки, то становится понятно, что либо это точка попадет в один какой-то круг, либо на границу каких то двух или же не попадет никуда.

Подберем бинпоиском именно это "примерное" место попадания выстрела в исходные мишени. Для удобства в реализации, просто посмотрим пару окружностей слева и справа от найденной и запишем в ответ для них номер этой точки (если эти круги еще не были закрыты).

Итого получаем решение со сложностью O(M * log N). Также можно отметить, что эту задачу можно решать за линейной время с помощью двух указателей, однако из-за сортировки это решение имеет такую же сложность.
  • Проголосовать: нравится
  • +15
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
В задаче С возможен алгоритм за линейное время. Сначала по координате центра круга(Xi) и его радиусу (Ri) в массиве mx отметим, что в координате по ОХ присутствует круг с номером i, выполнив заполнение на Ri элементов вправо и влево от индекса Xi номером круга i. O(n*r). Также будем хранить у каждого круга по его номеру его радиус, и координату центра. O(n). 
При каждом запросе((т.е. выстреле) координаты X,Y)) мы будем проверять лежит ли вообще в координате x какой-либо круг,если да, то узнав его номер, проверяем на попадание, зная координаты X,Y,Xi (i определим из mx[X]).O(m) . Если попадание произошло, то отметим данный круг любым способом.
Также надо учесть, что в одной координате по ОХ могут находится два круга. 
В итоге получаем сложность O(n+m);
13 лет назад, # |
  Проголосовать: нравится +13 Проголосовать: не нравится
Если делать так, как говорите Вы, то решение имеет сложность O(N * R), что медленнее решения, представленного в разборе за O(M * log N) из-за предпосчета массива mx. Хотя и оно является верным.
  • 13 лет назад, # ^ |
      Проголосовать: нравится +11 Проголосовать: не нравится
    это можно сделать а-ля прибавление на подмассиве offline, в нужных местах ставя +1 и -1. действительно, решение за линейное время
13 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
Да, это верно. Поскольку круги не пересекаются, можно записать для каждого круга i в позиции X[i] - R[i] и X[i] + R[i] значение плюс (открытие круга) и минус (закрытие круга) номер i. Затем пройти слева направо по массиву и посчитать выше упомянутый массив mx. Тогда получим линейную сложность решения.