Арена: сколько уровней подряд

тема: DP 1D · уровень: продвинутый

Условие

В игре есть «Арена улучшений»: чтобы открыть новый уровень награды, ты должен показать цепочку боёв, где каждый следующий бой дал *строго больше* очков, чем предыдущий в этой цепочке. Бои можно выбирать не подряд: главное — сохранить их порядок по времени.

Найди, какой максимальной длины цепочку можно собрать.

Формат ввода

Первая строка: целое число n — количество боёв. Вторая строка: n целых чисел a1, a2, ..., an — очки за каждый бой по времени.

Формат вывода

Выведи одно целое число — максимальную длину строго возрастающей подпоследовательности.

Ограничения

Пример

Ввод:

8
5 1 6 2 3 4 0 7

Вывод:

5

Пояснение: можно взять бои с очками 1 2 3 4 7 (они идут в правильном порядке и строго растут).

Как решать — идея подхода

Приём: LIS за O(n log n): «хвосты» + бинарный поиск

Ключевое наблюдение: нам важна не сама цепочка, а её длина. Если для какой-то длины мы умеем хранить *наименьший возможный последний элемент* ("хвост"), то это всегда выгодно: меньший хвост легче продолжить дальше.

Заведём массив d: d[k] — минимальный хвост строго возрастающей подпоследовательности длины k+1 среди уже просмотренных боёв. Тогда d всегда отсортирован по возрастанию, и для нового значения x можно быстро найти, какую длину он улучшает.

Почему работает: если x может стать хвостом для длины k+1, то лучше хранить минимальный хвост — он оставляет максимум шансов достроить цепочку.

План:

Мини-сниппет для шага поиска/обновления:

Сложность: n шагов, каждый с бинарным поиском по d → O(n log n), память O(n).

Частая ошибка: перепутать строгость. Для *строго* возрастающей подпоследовательности нужен именно поиск первой >= x. Если взять первую > x, получится вариант для неубывающей последовательности и ответ может стать неверным при равных значениях.

Решить задачу с автопроверкой на Python →

Куда дальше