Сбившаяся лента на заводе

тема: Моделирование процессов · уровень: средний

Условие

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

Коробки стоят в ряд (слева направо — от входа к выходу). Команды действуют так:

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

Формат ввода

Формат вывода Выведите n чисел — номера коробок слева направо после выполнения всех команд.

Ограничения

Пример Ввод:

5 6
10 20 30 40 50
LTLRTR

Вывод:

10 20 30 40 50

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

Приём: Дек (deque) + ленивый разворот

Ключевое наблюдение: команда T не обязана реально переворачивать весь ряд (это O(n) каждый раз). Достаточно помнить, «смотрим» ли мы на ленту в обычном направлении или в перевёрнутом. Тогда команды L и R просто меняются местами: то, что было «первым», становится «последним», и наоборот.

Приём: двусторонняя очередь (deque) + флаг rev (перевёрнуто/нет). Deque умеет быстро (за O(1)) доставать и добавлять элементы с обоих концов, что идеально соответствует операциям.

План:

Сложность: O(n + q) по времени, память O(n).

Частая ошибка: при rev == True забыть, что L и R меняют смысл местами, и продолжать двигать «слева направо» как обычно.

Разберись руками

Есть 5 коробок в порядке слева направо: 10 20 30 40 50. Мастер нажимает 6 команд подряд: L T L R T R. Ты руками «прокрутишь» ленту и увидишь, что получится в конце.

Идея: Идея такая: выполнять команды строго по порядку и каждый раз обновлять текущий порядок коробок. Для L и R ты реально переносишь крайний элемент (первый или последний), а для T просто переворачиваешь весь порядок и продолжаешь уже с новым списком.

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

Куда дальше