HolkinPV's blog

By HolkinPV, 13 years ago, In Russian

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

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

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

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

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

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

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

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

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