Сбившаяся лента на заводе
Условие
На заводе лента-конвейер возит коробки по кругу. У мастера есть пульт с тремя кнопками, и он нажимает их подряд, пытаясь «поймать» нужную коробку у входа.
Коробки стоят в ряд (слева направо — от входа к выходу). Команды действуют так:
L— первую коробку переложить в конец ленты.R— последнюю коробку переложить в начало ленты.T— развернуть направление ленты: порядок коробок становится обратным.
Нужно узнать, в каком порядке окажутся коробки после всех нажатий.
Формат ввода
- В первой строке два целых числа
nиq— число коробок и число нажатий. - Во второй строке
nцелых чиселa1, a2, ..., an— номера коробок слева направо. - В третьей строке строка
sдлиныq, состоящая только из символовL,R,T— команды пульта по порядку.
Формат вывода Выведите n чисел — номера коробок слева направо после выполнения всех команд.
Ограничения
2 ≤ n ≤ 80001 ≤ q ≤ 8000-10^9 ≤ ai ≤ 10^9
Пример Ввод:
5 6
10 20 30 40 50
LTLRTR
Вывод:
10 20 30 40 50Как решать — идея подхода
Приём: Дек (deque) + ленивый разворот
Ключевое наблюдение: команда T не обязана реально переворачивать весь ряд (это O(n) каждый раз). Достаточно помнить, «смотрим» ли мы на ленту в обычном направлении или в перевёрнутом. Тогда команды L и R просто меняются местами: то, что было «первым», становится «последним», и наоборот.
Приём: двусторонняя очередь (deque) + флаг rev (перевёрнуто/нет). Deque умеет быстро (за O(1)) доставать и добавлять элементы с обоих концов, что идеально соответствует операциям.
План:
- Считай массив коробок в
deque. - Заведи
rev = False. - Иди по строке команд:
- Если
T: сделайrev = not rev. - Если
L: - при
rev == False: «первую в конец» =x = popleft(); append(x) - при
rev == True: на самом деле это «последнюю в начало». - Если
R: - при
rev == False: «последнюю в начало» - при
rev == True: на самом деле это «первую в конец». - В конце, если
rev == True, выводи элементы в обратном порядке (можно пройтисьreversed(deque)), не делая дорогих операций внутри цикла.
Сложность: O(n + q) по времени, память O(n).
Частая ошибка: при rev == True забыть, что L и R меняют смысл местами, и продолжать двигать «слева направо» как обычно.
Разберись руками
Есть 5 коробок в порядке слева направо: 10 20 30 40 50. Мастер нажимает 6 команд подряд: L T L R T R. Ты руками «прокрутишь» ленту и увидишь, что получится в конце.
- Прогоним первые 3 команды: L, потом T, потом L. Старт: «10 20 30 40 50». После каждого шага запиши порядок слева направо.
- Теперь продолжим оставшиеся 3 команды: R, потом T, потом R. Стартуй с того, что получилось после первых 3 команд.
- Сравни старт и финал: порядок коробок стал таким же, как был в самом начале?
Идея: Идея такая: выполнять команды строго по порядку и каждый раз обновлять текущий порядок коробок. Для L и R ты реально переносишь крайний элемент (первый или последний), а для T просто переворачиваешь весь порядок и продолжаешь уже с новым списком.
Решить задачу с автопроверкой на Python →
Куда дальше
- Школьный этап ВсОШ по информатике — как устроен первый этап и план подготовки за четыре недели
- Python на олимпиадах — где языка хватает с запасом, а где начинают значить лимиты — с замерами
- Родителям: подготовка бесплатно — сколько стоит репетитор, что даёт бесплатный маршрут и как понять, что ребёнок занимается