Автор: | А. Кленин | Ограничение времени: | 4 сек | |
Входной файл: | Стандартный вход | Ограничение памяти: | 256 Мб | |
Выходной файл: | Стандартный выход |
Юный супергерой Вася однажды выяснил, что на один из небоскрёбов его города планирует напасть группа из N злодеев. Небоскрёб состоит из M этажей, пронумерованных от 1 до M. Вася прибыл на первый этаж непосредственно перед началом нападения злодеев и приготовился его отражать.
Злодей номер i появляется на этаже fi через ti секунд после начала нападения, и начинает творить зло со скоростью одно злое дело в секунду.
Каждую секунду Вася проделывает следующие действия:
Требуется определить, сколько злых дел успеют совершить все злодеи в сумме.
Входной файл содержит целые числа M N, за которыми следует N пар целых чисел ti fi.
Выходной файл должен содержать единственное целое число — количество злых дел.
1 ≤ N ≤ 106
1 ≤ fi ≤ M ≤ 109
1 ≤ ti ≤ ti + 1 ≤ 109
№ | Стандартный вход | Стандартный выход |
---|---|---|
1 |
|
|
2 |
|
|
3 |
|
|
Так как злодеи на вход программе передаются последовательно, можно просчитывать только моменты их появления.
Программа просчитывает не каждую секунду, а прыгает от момента появления одного злодея до момента появления следующего.
Для этого нужно лишь знать где находился герой на момент появления предыдущего злодея.
Когда мы побеждаем злодея, то счетчик злодеяний увеличивается на разницу между текущем времени и моментом, когда злодей появился.
Заведем две очереди, в первой будем хранить отсортированных злодеев, которые находятся ниже героя, а во второй тех, что выше.
Когда приходит новый злодей, мы выбираем в какую очередь его добавить и вставляем его туда за O(log N).
Далее моделируем передвижение героя:
taim - время, прибытия злодея, tnow - текущее время. Пока текущее меньше, чем время прибытия выбираем куда двигаться, обращаясь к двум очередям и беря из них верхний элемент.
Из очереди достается ближайший враг. Есть 2 варианта: Первый, успеваем добежать, тогда к текущее время увеличивается на разницу между позициями героя и злодея. Второй, не успеваем, тогда время равно времени прибытия злодея. По той же логике - сдвигается текущая позиция героя.
Повторяем, пока не выполнится условие.
Асимптотика алгоритма: O(N log N)