Skip to content

Решения задач из различных тренировок по алгоритмам

License

Notifications You must be signed in to change notification settings

monk-time/algorithms

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Алгоритмы и структуры данных

Решения задач из различных тренировок по алгоритмам.

Задачи разбиты на блоки, к каждому блоку приложены тесты, написанные на pytest.

Спринт 1: Введение в алгоритмы

A. Значения функции

[Источник] [Решение]

Вася делает тест по математике: вычисляет значение функций в различных точках. Стоит отличная погода, и друзья зовут Васю гулять. Но мальчик решил сначала закончить тест и только после этого идти к друзьям. К сожалению, Вася пока не умеет программировать. Зато вы умеете. Помогите Васе написать код функции, вычисляющей y = a * x^2 + b * x + c. Напишите программу, которая будет по коэффициентам a, b, c и числу x выводить значение функции в точке x.

Формат ввода

На вход через пробел подаются целые числа a, x, b, c. В конце ввода находится перенос строки.

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

Выведите одно число — значение функции в точке x.

Пример

Ввод Вывод
-8 -5 -2 7 -183
8 2 9 -10 40
B. Чётные и нечётные числа

[Источник] [Решение]

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

Формат ввода

В первой строке записаны три случайных целых числа a, b и c. Числа не превосходят 10^9 по модулю.

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

Выведите «WIN», если игрок выиграл, и «FAIL» в противном случае.

Пример

Ввод Вывод
1 2 -3 FAIL
7 11 7 WIN
6 -2 0 WIN
C. Соседи

[Источник] [Решение]

Дана матрица. Нужно написать функцию, которая для элемента возвращает всех его соседей. Соседним считается элемент, находящийся от текущего на одну ячейку влево, вправо, вверх или вниз. Диагональные элементы соседними не считаются.
Например, в матрице A соседними элементами для (0, 0) будут 2 и 0. А для (2, 1) –— 1, 2, 7, 7.

Формат ввода

В первой строке задано n — количество строк матрицы. Во второй — количество столбцов m. Числа m и n не превосходят 1000. В следующих n строках задана матрица. Элементы матрицы — целые числа, по модулю не превосходящие 1000. В последних двух строках записаны координаты элемента, соседей которого нужно найти. Индексация начинается с нуля.

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

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

Пример

Ввод Вывод
4
3
1 2 3
0 2 6
7 4 1
2 7 0
3
0
7 7
4
3
1 2 3
0 2 6
7 4 1
2 7 0
0
0
0 2
D. Хаотичность погоды

[Источник] [Решение]

Метеорологическая служба вашего города решила исследовать погоду новым способом.

  • Под температурой воздуха в конкретный день будем понимать максимальную температуру в этот день.
  • Под хаотичностью погоды за n дней служба понимает количество дней, в которые температура строго больше, чем в день до (если такой существует) и в день после текущего (если такой существует). Например, если за 5 дней максимальная температура воздуха составляла [1, 2, 5, 4, 8] градусов, то хаотичность за этот период равна 2: в 3-й и 5-й дни выполнялись описанные условия.

Определите по ежедневным показаниям температуры хаотичность погоды за этот период.
Заметим, что если число показаний n=1, то единственный день будет хаотичным.

Формат ввода

В первой строке дано число n — длина периода измерений в днях, 1 ≤ n ≤ 10^5. Во второй строке даны n целых чисел — значения температуры в каждый из n дней. Значения температуры не превосходят 273 по модулю.

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

Выведите единственное число — хаотичность за данный период.

Пример

Ввод Вывод
7
-1 -10 -8 0 2 0 5
3
5
1 2 5 4 8
2
E. Самое длинное слово

[Источник] [Решение]

Чтобы подготовиться к семинару, Гоше надо прочитать статью по эффективному менеджменту. Так как Гоша хочет спланировать день заранее, ему необходимо оценить сложность статьи.
Он придумал такой метод оценки: берётся случайное предложение из текста и в нём ищется самое длинное слово. Его длина и будет условной сложностью статьи.
Помогите Гоше справиться с этой задачей.

Формат ввода

В первой строке дана длина текста L (1 ≤ L ≤ 10^5).
В следующей строке записан текст, состоящий из строчных латинских букв и пробелов. Слово —– последовательность букв, не разделённых пробелами. Пробелы могут стоять в самом начале строки и в самом её конце. Текст заканчивается переносом строки, этот символ не включается в число остальных L символов.

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

В первой строке выведите самое длинное слово. Во второй строке выведите его длину. Если подходящих слов несколько, выведите то, которое встречается раньше.

Пример

Ввод Вывод
19
i love segment tree
segment
7
21
frog jumps from river
jumps
5
F. Палиндром

[Источник] [Решение]

Помогите Васе понять, будет ли фраза палиндромом. Учитываются только буквы и цифры, заглавные и строчные буквы считаются одинаковыми.
Решение должно работать за O(N), где N — длина строки на входе.

Формат ввода

В единственной строке записана фраза или слово. Буквы могут быть только латинские. Длина текста не превосходит 20000 символов.
Фраза может состоять из строчных и прописных латинских букв, цифр, знаков препинания.

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

Выведите «True», если фраза является палиндромом, и «False», если не является.

Пример

Ввод Вывод
A man, a plan, a canal: Panama True
zo False
G. Работа из дома

[Источник] [Решение]

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

Формат ввода

На вход подаётся целое число в диапазоне от 0 до 10000.

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

Выведите двоичное представление этого числа.

Пример

Ввод Вывод
5 101
14 1110
H. Двоичная система

[Источник] [Решение]

Тимофей записал два числа в двоичной системе счисления и попросил Гошу вывести их сумму, также в двоичной системе. Встроенную в язык программирования возможность сложения двоичных чисел применять нельзя. Помогите Гоше решить задачу.
Решение должно работать за O(N), где N –— количество разрядов максимального числа на входе.

Формат ввода

Два числа в двоичной системе счисления, каждое на отдельной строке. Длина каждого числа не превосходит 10 000 символов.

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

Одно число в двоичной системе счисления.

Пример

Ввод Вывод
1010
1011
10101
1
1
10
I. Степень четырёх

[Источник] [Решение]

Напишите программу, которая определяет, будет ли положительное целое число степенью четвёрки.
Подсказка: степенью четвёрки будут все числа вида 4^n, где n – целое неотрицательное число.

Формат ввода

На вход подаётся целое число в диапазоне от 1 до 10000.

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

Выведите «True», если число является степенью четырёх, «False» –— в обратном случае.

Пример

Ввод Вывод
15 False
16 True
J. Факторизация

[Источник] [Решение]

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

  • Число 8 можно представить как 2 × 2 × 2.
  • Число 50 –— как 2 × 5 × 5 (или 5 × 5 × 2, или 5 × 2 × 5). Три варианта отличаются лишь порядком следования множителей.

Разложение числа на простые множители называется факторизацией числа.
Напишите программу, которая производит факторизацию переданного числа.

Формат ввода

В единственной строке дано число n (2 ≤ n ≤ 10^9), которое нужно факторизовать.

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

Выведите в порядке неубывания простые множители, на которые раскладывается число n.

Пример

Ввод Вывод
8 2 2 2
13 13
100 2 2 5 5
K. Списочная форма

[Источник] [Решение]

Вася просил Аллу помочь решить задачу. На этот раз по информатике.
Для неотрицательного целого числа X списочная форма –— это массив его цифр слева направо. К примеру, для 1231 списочная форма будет [1,2,3,1]. На вход подается количество цифр числа Х, списочная форма неотрицательного числа Х и неотрицательное число K. Число К не превосходят 10000. Длина числа Х не превосходит 1000.
Нужно вернуть списочную форму числа X + K.

Формат ввода

В первой строке — длина списочной формы числа X. На следующей строке — сама списочная форма с цифрами записанными через пробел.
В последней строке записано число K, 0 ≤ K ≤ 10000.

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

Выведите списочную форму числа X+K.

Пример

Ввод Вывод
4
1 2 0 0
34
1 2 3 4
2
9 5
17
1 1 2
L. Лишняя буква

[Источник] [Решение]

Васе очень нравятся задачи про строки, поэтому он придумал свою. Есть 2 строки s и t, состоящие только из строчных букв. Строка t получена перемешиванием букв строки s и добавлением 1 буквы в случайную позицию. Нужно найти добавленную букву.

Формат ввода

На вход подаются строки s и t, разделённые переносом строки. Длины строк не превосходят 1000 символов. Строки не бывают пустыми.

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

Выведите лишнюю букву.

Пример

Ввод Вывод
abcd
abcde
e
go
ogg
g
xtkpx
xkctpx
c

Финальные задачи

A. Ближайший ноль

[Источник] [Решение]

Тимофей ищет место, чтобы построить себе дом. Улица, на которой он хочет жить, имеет длину n, то есть состоит из n одинаковых идущих подряд участков. Каждый участок либо пустой, либо на нём уже построен дом.
Общительный Тимофей не хочет жить далеко от других людей на этой улице. Поэтому ему важно для каждого участка знать расстояние до ближайшего пустого участка. Если участок пустой, эта величина будет равна нулю — расстояние до самого себя.
Помогите Тимофею посчитать искомые расстояния. Для этого у вас есть карта улицы. Дома в городе Тимофея нумеровались в том порядке, в котором строились, поэтому их номера на карте никак не упорядочены. Пустые участки обозначены нулями.

Формат ввода

В первой строке дана длина улицы —– n (1 ≤ n ≤ 10^6). В следующей строке записаны n целых неотрицательных чисел — номера домов и обозначения пустых участков на карте (нули). Гарантируется, что в последовательности есть хотя бы один ноль. Номера домов (положительные числа) уникальны и не превосходят 10^9.

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

Для каждого из участков выведите расстояние до ближайшего нуля. Числа выводите в одну строку, разделяя их пробелами.

Пример

Ввод Вывод
5
0 1 4 9 0
0 1 2 1 0
6
0 7 9 4 8 20
0 1 2 3 4 5
B. Ловкость рук

[Источник] [Решение]

«Тренажёр для скоростной печати» представляет собой квадратную клавиатуру из шестнадцати клавиш размером 4x4. На каждой клавише может быть изображена либо точка, либо цифра от 1 до 9.
Занятие на тренажёре делится на раунды:

  • каждый раунд состоит из нескольких игр;
  • в разных раундах число игр может быть разным;
  • номер каждой игры в раунде обозначается счётчиком t.

Для каждого раунда на клавишах устанавливаются определённые значения, которые остаются неизменными в течение всех игр раунда.

Значение счётчика игр t не может превысить значение самого большого числа, отображённого на клавиатуре в текущем раунде.
В упражнении на тренажёре принимают участие два игрока, они играют вдвоём на одной клавиатуре. Для каждого раунда устанавливается максимальное число клавиш, которые может нажать один игрок (оно обозначается переменной k и не изменяется в течение раунда).
В каждой отдельной игре участники должны вместе нажать на клавиши, на которых изображена цифра, соответствующая номеру игры t. Например, во второй игре раунда игроки должны нажать все те клавиши, на которых изображена двойка.
В раунде могут быть игры, где не требуется нажимать кнопки: например, в приведённом варианте раунда в играх от t = 4 до t = 8 кнопки нажимать не потребуется: на клавиатуре нет цифр от 4 до 8:

Если в очередной игре у участников есть возможность нажать все необходимые клавиши — они их нажимают и получают 1 балл.
Предположим, что для раунда задан набор кнопок, как на картинке, и k = 3 (каждый из участников может нажать не более трёх кнопок). Тогда во второй игре (t = 2), где должны быть нажаты двойки, игроки вдвоём смогут нажать только 6 клавиш (k * 2 = 6). Но на клавиатуре семь двоек; участники не смогут нажать их все и не получат балл.

Напишите программу, которая будет принимать данные для определённого раунда:

  • значение k,
  • значения для кнопок,

и вычислит количество баллов, которое будут заработано в этом раунде.

Формат ввода

В первой строке дано целое число k (1 ≤ k ≤ 5).
В четырёх следующих строках заданы значения для кнопок –— по 4 символа в каждой строке. Каждый символ —– либо точка, либо цифра от 1 до 9. Символы одной строки идут подряд и не разделены пробелами.

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

Выведите единственное число –— количество баллов, которое игроки наберут в раунде.

Пример

Ввод Вывод
3
1231
2..2
2..2
2..2
2
4
1111
9999
1111
9911
1
4
1111
1111
1111
1111
0

Спринт 2: Основные структуры данных

A. Мониторинг

[Источник] [Решение]

Алла получила задание, связанное с мониторингом работы различных серверов. Требуется понять, сколько времени обрабатываются определённые запросы на конкретных серверах. Эту информацию нужно хранить в матрице, где номер столбца соответствуют идентификатору запроса, а номер строки — идентификатору сервера. Алла перепутала строки и столбцы местами. С каждым бывает. Помогите ей исправить баг.
Есть матрица размера m × n. Нужно написать функцию, которая её транспонирует.
Транспонированная матрица получается из исходной заменой строк на столбцы.
Например, для матрицы А (слева) транспонированной будет следующая матрица (справа):

Формат ввода

В первой строке задано число n — количество строк матрицы.
Во второй строке задано m — число столбцов, m и n не превосходят 1000. В следующих n строках задана матрица. Числа в ней не превосходят по модулю 1000.

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

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

Пример

Ввод Вывод
4
3
1 2 3
0 2 6
7 4 1
2 7 0
1 0 7 2
2 2 4 7
3 6 1 0
9
5
-7 -1 0 -4 -9
5 -1 2 2 9
3 1 -8 -1 -7
9 0 8 -8 -1
2 4 5 2 8
-7 10 0 -4 -8
-3 10 -7 10 3
1 6 -7 -5 9
-1 9 9 1 9
-7 5 3 9 2 -7 -3 1 -1
-1 -1 1 0 4 10 10 6 9
0 2 -8 8 5 0 -7 -7 9
-4 2 -1 -8 2 -4 10 -5 1
-9 9 -7 -1 8 -8 3 9 9
B. Список дел

[Источник] [Решение]

Васе нужно распечатать свой список дел на сегодня. Помогите ему: напишите функцию, которая печатает все его дела. Известно, что дел у Васи не больше 5000.
Внимание: в этой задаче не нужно считывать входные данные. Нужно написать только функцию, которая принимает на вход голову списка и печатает его элементы. Ниже дано описание структуры, которая задаёт узел списка.

Формат ввода

В качестве ответа сдайте только код функции, которая печатает элементы списка. Длина списка не превосходит 5000 элементов. Список не бывает пустым.

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

Функция должна напечатать элементы списка по одному в строке.

C. Нелюбимое дело

[Источник] [Решение]

Вася размышляет, что ему можно не делать из того списка дел, который он составил. Но, кажется, все пункты очень важные! Вася решает загадать число и удалить дело, которое идёт под этим номером. Список дел представлен в виде односвязного списка. Напишите функцию solution, которая принимает на вход голову списка и номер удаляемого дела и возвращает голову обновлённого списка.
Внимание: в этой задаче не нужно считывать входные данные. Нужно написать только функцию, которая принимает на вход голову списка и номер удаляемого элемента и возвращает голову обновлённого списка.

Формат ввода

Функция принимает голову списка и индекс элемента, который надо удалить (нумерация с нуля). Список содержит не более 5000 элементов. Список не бывает пустым.

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

Верните голову списка, в котором удален нужный элемент.

D. Заботливая мама

[Источник] [Решение]

Мама Васи хочет знать, что сын планирует делать и когда. Помогите ей: напишите функцию solution, определяющую индекс первого вхождения передаваемого ей на вход значения в связном списке, если значение присутствует.
Внимание: в этой задаче не нужно считывать входные данные. Нужно написать только функцию, которая принимает на вход голову списка и искомый элемент, а возвращает целое число — индекс найденного элемента или -1.

Формат ввода

Функция на вход принимает голову односвязного списка и элемент, который нужно найти. Длина списка не превосходит 10000 элементов. Список не бывает пустым.

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

Функция возвращает индекс первого вхождения искомого элемента в список(индексация начинается с нуля). Если элемент не найден, нужно вернуть -1.

E. Всё наоборот

[Источник] [Решение]

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

Формат ввода

Функция принимает на вход единственный аргумент — голову двусвязного списка.
Длина списка не превосходит 1000 элементов. Список не бывает пустым.

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

Функция должна вернуть голову развернутого списка.

F. Стек - Max

[Источник] [Решение]

Нужно реализовать класс StackMax, который поддерживает операцию определения максимума среди всех элементов в стеке. Класс должен поддерживать операции push(x), где x – целое число, pop() и get_max().

Формат ввода

В первой строке записано одно число n — количество команд, которое не превосходит 10000. В следующих n строках идут команды. Команды могут быть следующих видов:

  • push(x) — добавить число x в стек;
  • pop() — удалить число с вершины стека;
  • get_max() — напечатать максимальное число в стеке;

Если стек пуст, при вызове команды get_max() нужно напечатать «None», для команды pop() — «error».

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

Для каждой команды get_max() напечатайте результат её выполнения. Если стек пустой, для команды get_max() напечатайте «None». Если происходит удаление из пустого стека — напечатайте «error».

Пример

Ввод Вывод
8
get_max
push 7
pop
push -2
push -1
pop
get_max
get_max
None
-2
-2
7
get_max
pop
pop
pop
push 10
get_max
push -9
None
error
error
error
10
G. Стек - MaxEffective

[Источник] [Решение]

Реализуйте класс StackMaxEffective, поддерживающий операцию определения максимума среди элементов в стеке. Сложность операции должна быть O(1). Для пустого стека операция должна возвращать None. При этом push(x) и pop() также должны выполняться за константное время.

Формат ввода

В первой строке записано одно число — количество команд, оно не превосходит 100000. Далее идут команды по одной в строке. Команды могут быть следующих видов:

  • push(x) — добавить число x в стек;
  • pop() — удалить число с вершины стека;
  • get_max() — напечатать максимальное число в стеке;

Если стек пуст, при вызове команды get_max нужно напечатать «None», для команды pop — «error».

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

Для каждой команды get_max() напечатайте результат её выполнения. Если стек пустой, для команды get_max() напечатайте «None». Если происходит удаление из пустого стека — напечатайте «error».

Пример

Ввод Вывод
10
pop
pop
push 4
push -5
push 7
pop
pop
get_max
pop
get_max
error
error
4
None
10
get_max
push -6
pop
pop
get_max
push 2
get_max
pop
push -2
push -6
None
error
None
2
H. Скобочная последовательность

[Источник] [Решение]

Вот какую задачу Тимофей предложил на собеседовании одному из кандидатов. Если вы с ней ещё не сталкивались, то наверняка столкнётесь –— она довольно популярная.
Дана скобочная последовательность. Нужно определить, правильная ли она.
Будем придерживаться такого определения:

  • пустая строка —– правильная скобочная последовательность;
  • правильная скобочная последовательность, взятая в скобки одного типа, –— правильная скобочная последовательность;
  • правильная скобочная последовательность с приписанной слева или справа правильной скобочной последовательностью —– тоже правильная.

На вход подаётся последовательность из скобок трёх видов: [], (), {}.
Напишите функцию is_correct_bracket_seq, которая принимает на вход скобочную последовательность и возвращает True, если последовательность правильная, а иначе False.

Формат ввода

На вход подаётся одна строка, содержащая скобочную последовательность. Скобки записаны подряд, без пробелов.

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

Выведите «True» или «False».

Пример

Ввод Вывод
{[()]} True
() True
I. Ограниченная очередь

[Источник] [Решение]

Астрологи объявили день очередей ограниченного размера. Тимофею нужно написать класс MyQueueSized, который принимает параметр max_size, означающий максимально допустимое количество элементов в очереди.
Помогите ему —– реализуйте программу, которая будет эмулировать работу такой очереди. Функции, которые надо поддержать, описаны в формате ввода.

Формат ввода

В первой строке записано одно число — количество команд, оно не превосходит 5000. Во второй строке задан максимально допустимый размер очереди, он не превосходит 5000. Далее идут команды по одной на строке. Команды могут быть следующих видов:

  • push(x) — добавить число x в очередь;
  • pop() — удалить число из очереди и вывести на печать;
  • peek() — напечатать первое число в очереди;
  • size() — вернуть размер очереди;

При превышении допустимого размера очереди нужно вывести «error». При вызове операций pop() или peek() для пустой очереди нужно вывести «None».

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

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

Пример

Ввод Вывод
8
2
peek
push 5
push 2
peek
size
size
push 1
size
None
5
2
2
error
2
10
1
push 1
size
push 3
size
push 1
pop
push 1
pop
push 3
push 3
1
error
1
error
1
1
error
J. Списочная очередь

[Источник] [Решение]

Любимый вариант очереди Тимофея — очередь, написанная с использованием связного списка. Помогите ему с реализацией. Очередь должна поддерживать выполнение трёх команд:

  • get() — вывести элемент, находящийся в голове очереди, и удалить его. Если очередь пуста, то вывести «error».
  • put(x) — добавить число x в очередь
  • size() — вывести текущий размер очереди

Формат ввода

В первой строке записано количество команд n — целое число, не превосходящее 1000. В каждой из следующих n строк записаны команды по одной строке.

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

Выведите ответ на каждый запрос по одному в строке.

Пример

Ввод Вывод
10
put -34
put -23
get
size
get
size
get
get
put 80
size
-34
1
-23
0
error
error
1
6
put -66
put 98
size
size
get
get
2
2
-66
98
9
get
size
put 74
get
size
put 90
size
size
size
error
0
74
0
1
1
1
K. Рекурсивные числа Фибоначчи

[Источник] [Решение]

У Тимофея было n (0 ≤ n ≤ 32) стажёров. Каждый стажёр хотел быть лучше своих предшественников, поэтому i-й стажёр делал столько коммитов, сколько делали два предыдущих стажёра в сумме. Два первых стажёра были менее инициативными —– они сделали по одному коммиту.
Пусть F_i —– число коммитов, сделанных i-м стажёром (стажёры нумеруются с нуля). Тогда выполняется следующее: F_0 = F_1 = 1. Для всех i ≥ 2 выполнено F_i = F_i−1 + F_i−2.
Определите, сколько кода напишет следующий стажёр –— найдите F_n.
Решение должно быть реализовано рекурсивно.

Формат ввода

На вход подаётся n — целое число в диапазоне от 0 до 32.

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

Нужно вывести F_n.

Пример

Ввод Вывод
3 3
0 1
L. Фибоначчи по модулю

[Источник] [Решение]

У Тимофея было очень много стажёров, целых N (0 ≤ N ≤ 10^6) человек. Каждый стажёр хотел быть лучше своих предшественников, поэтому i-й стажёр делал столько коммитов, сколько делали два предыдущих стажёра в сумме. Два первых стажёра были менее инициативными — они сделали по одному коммиту.
Пусть Fi —– число коммитов, сделанных i-м стажёром (стажёры нумеруются с нуля). Первые два стажёра сделали по одному коммиту: F_0 = F_1 = 1. Для всех i ≥ 2 выполнено F_i = F_i−1 + F_i−2.
Определите, сколько кода напишет следующий стажёр –— найдите последние k цифр числа F_n.

Как найти k последних цифр

Чтобы вычислить k последних цифр некоторого числа x, достаточно взять остаток от его деления на число 10^k. Эта операция обозначается как x mod 10^k. Узнайте, как записывается операция взятия остатка по модулю в вашем языке программирования.
Также обратите внимание на возможное переполнение целочисленных типов, если в вашем языке такое случается.

Формат ввода

В первой строке записаны через пробел два целых числа n (0 ≤ n ≤ 10^6) и k (1 ≤ k ≤ 8).

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

Выведите единственное число – последние k цифр числа F_n.
Если в искомом числе меньше k цифр, то выведите само число без ведущих нулей.

Пример

Ввод Вывод
3 1 3
10 1 9

Финальные задачи

A. Дек

[Источник] [Решение]

Гоша реализовал структуру данных Дек, максимальный размер которого определяется заданным числом. Методы push_back(x), push_front(x), pop_back(), pop_front() работали корректно. Но, если в деке было много элементов, программа работала очень долго. Дело в том, что не все операции выполнялись за O(1). Помогите Гоше! Напишите эффективную реализацию.
Внимание: при реализации используйте кольцевой буфер.

Формат ввода

В первой строке записано количество команд n — целое число, не превосходящее 100000. Во второй строке записано число m — максимальный размер дека. Он не превосходит 50000. В следующих n строках записана одна из команд:

  • push_back(value) – добавить элемент в конец дека. Если в деке уже находится максимальное число элементов, вывести «error».
  • push_front(value) – добавить элемент в начало дека. Если в деке уже находится максимальное число элементов, вывести «error».
  • pop_front() – вывести первый элемент дека и удалить его. Если дек был пуст, то вывести «error».
  • pop_back() – вывести последний элемент дека и удалить его. Если дек был пуст, то вывести «error».

Value — целое число, по модулю не превосходящее 1000.

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

Выведите результат выполнения каждой команды на отдельной строке. Для успешных запросов push_back(x) и push_front(x) ничего выводить не надо.

Пример

Ввод Вывод
4
4
push_front 861
push_front -819
pop_back
pop_back
861
-819
7
10
push_front -855
push_front 0
pop_back
pop_back
push_back 844
pop_back
push_back 823
-855
0
844
6
6
push_front -201
push_back 959
push_back 102
push_front 20
pop_front
pop_back
20
102
B. Калькулятор

[Источник] [Решение]

Задание связано с обратной польской нотацией. Она используется для парсинга арифметических выражений. Еще её иногда называют постфиксной нотацией.
В постфиксной нотации операнды расположены перед знаками операций.

Пример 1:
3 4 +
означает 3 + 4 и равно 7

Пример 2:
12 5 /
Так как деление целочисленное, то в результате получим 2.

Пример 3:
10 2 4 * -
означает 10 - 2 * 4 и равно 2

Разберём последний пример подробнее:
Знак * стоит сразу после чисел 2 и 4, значит к ним нужно применить операцию, которую этот знак обозначает, то есть перемножить эти два числа. В результате получим 8.
После этого выражение приобретёт вид:
10 8 -
Операцию «минус» нужно применить к двум идущим перед ней числам, то есть 10 и 8. В итоге получаем 2.
Рассмотрим алгоритм более подробно. Для его реализации будем использовать стек.
Для вычисления значения выражения, записанного в обратной польской нотации, нужно считывать выражение слева направо и придерживаться следующих шагов:

  1. Обработка входного символа:
  • Если на вход подан операнд, он помещается на вершину стека.
  • Если на вход подан знак операции, то эта операция выполняется над требуемым количеством значений, взятых из стека в порядке добавления. Результат выполненной операции помещается на вершину стека.
  1. Если входной набор символов обработан не полностью, перейти к шагу 1.
  2. После полной обработки входного набора символов результат вычисления выражения находится в вершине стека. Если в стеке осталось несколько чисел, то надо вывести только верхний элемент.

Замечание про отрицательные числа и деление: в этой задаче под делением понимается математическое целочисленное деление. Это значит, что округление всегда происходит вниз. А именно: если a / b = c, то b ⋅ c — это наибольшее число, которое не превосходит a и одновременно делится без остатка на b.
Например, -1 / 3 = -1. Будьте осторожны: в C++, Java и Go, например, деление чисел работает иначе.
В текущей задаче гарантируется, что деления на отрицательное число нет.

Формат ввода

В единственной строке дано выражение, записанное в обратной польской нотации. Числа и арифметические операции записаны через пробел.
На вход могут подаваться операции: +, -, *, / и числа, по модулю не превосходящие 10000.
Гарантируется, что значение промежуточных выражений в тестовых данных по модулю не больше 50000.

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

Выведите единственное число — значение выражения.

Пример

Ввод Вывод
2 1 + 3 * 9
7 2 + 4 * 2 + 38

Спринт 3: Рекурсии и сортировки

A. Генератор скобок

[Источник] [Решение]

Рита по поручению Тимофея наводит порядок в правильных скобочных последовательностях (ПСП), состоящих только из круглых скобок (). Для этого ей надо сгенерировать все ПСП длины 2n в алфавитном порядке —– алфавит состоит из ( и ) и открывающая скобка идёт раньше закрывающей.
Помогите Рите —– напишите программу, которая по заданному n выведет все ПСП в нужном порядке.
Рассмотрим второй пример. Надо вывести ПСП из четырёх символов. Таких всего две:

  1. (())
  2. ()()

(()) идёт раньше ()(), так как первый символ у них одинаковый, а на второй позиции у первой ПСП стоит (, который идёт раньше ).

Формат ввода

На вход функция принимает n — целое число от 0 до 10.

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

Функция должна напечатать все возможные скобочные последовательности заданной длины в алфавитном (лексикографическом) порядке.

Пример

Ввод Вывод
3 ((()))
(()())
(())()
()(())
()()()
2 (())
()()
B. Комбинации

[Источник] [Решение]

На клавиатуре старых мобильных телефонов каждой цифре соответствовало несколько букв. Примерно так:

  • 2:'abc',
  • 3:'def',
  • 4:'ghi',
  • 5:'jkl',
  • 6:'mno',
  • 7:'pqrs',
  • 8:'tuv',
  • 9:'wxyz'

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

Формат ввода

На вход подается строка, состоящая из цифр 2-9 включительно. Длина строки не превосходит 10 символов.

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

Выведите все возможные комбинации букв через пробел.

Пример

Ввод Вывод
23 ad ae af bd be bf cd ce cf
92 wa wb wc xa xb xc ya yb yc za zb zc
C. Подпоследовательность

[Источник] [Решение]

Гоша любит играть в игру «Подпоследовательность»: даны 2 строки, и нужно понять, является ли первая из них подпоследовательностью второй. Когда строки достаточно длинные, очень трудно получить ответ на этот вопрос, просто посмотрев на них. Помогите Гоше написать функцию, которая решает эту задачу.

Формат ввода

В первой строке записана строка s. Во второй —- строка t.
Обе строки состоят из маленьких латинских букв, длины строк не превосходят 150000. Строки не могут быть пустыми.

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

Выведите True, если s является подпоследовательностью t, иначе —– False.

Пример

Ввод Вывод
abc
ahbgdcu
True
abcp
ahpc
False
D. Печеньки

[Источник] [Решение]

К Васе в гости пришли одноклассники. Его мама решила угостить ребят печеньем.
Но не всё так просто. Печенья могут быть разного размера. А у каждого ребёнка есть фактор жадности —– минимальный размер печенья, которое он возьмёт. Нужно выяснить, сколько ребят останутся довольными в лучшем случае, когда они действуют оптимально.
Каждый ребёнок может взять не больше одного печенья.

Формат ввода

В первой строке записано n —– количество детей.
Во второй —– n чисел, разделённых пробелом, каждое из которых –— фактор жадности ребёнка. Это натуральные числа, не превосходящие 1000.
В следующей строке записано число m –— количество печенек.
Далее —– m натуральных чисел, разделённых пробелом —– размеры печенек. Размеры печенек не превосходят 1000.
Оба числа n и m не превосходят 10000.

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

Нужно вывести одно число –— количество детей, которые останутся довольными

Пример

Ввод Вывод
2
1 2
3
2 1 3
2
3
2 1 3
2
1 1
1
E. Покупка домов

[Источник] [Решение]

Тимофей решил купить несколько домов на знаменитом среди разработчиков Алгосском архипелаге. Он нашёл n объявлений о продаже, где указана стоимость каждого дома в алгосских франках. А у Тимофея есть k франков. Помогите ему определить, какое наибольшее количество домов на Алгосах он сможет приобрести за эти деньги.

Формат ввода

В первой строке через пробел записаны натуральные числа n и k.
n — количество домов, которые рассматривает Тимофей, оно не превосходит 100000;
k — общий бюджет, не превосходит 100000;
В следующей строке через пробел записано n стоимостей домов. Каждое из чисел не превосходит 100000. Все стоимости — натуральные числа.

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

Выведите одно число —– наибольшее количество домов, которое может купить Тимофей.

Пример

Ввод Вывод
3 300
999 999 999
0
3 1000
350 999 200
2
F. Периметр треугольника

[Источник] [Решение]

Перед сном Рита решила поиграть в игру на телефоне. Дан массив целых чисел, в котором каждый элемент обозначает длину стороны треугольника. Нужно определить максимально возможный периметр треугольника, составленного из сторон с длинами из заданного массива. Помогите Рите скорее закончить игру и пойти спать.
Напомним, что из трёх отрезков с длинами a ≤ b ≤ c можно составить треугольник, если выполнено неравенство треугольника: c < a + b
Разберём пример:
даны длины сторон 6, 3, 3, 2. Попробуем в качестве наибольшей стороны выбрать 6. Неравенство треугольника не может выполниться, так как остались 3, 3, 2 —– максимальная сумма из них равна 6.
Без шестёрки оставшиеся три отрезка уже образуют треугольник со сторонами 3, 3, 2. Неравенство выполняется: 3 < 3 + 2. Периметр равен 3 + 3 + 2 = 8.

Формат ввода

В первой строке записано количество отрезков n, 3 ≤ n ≤ 10000.
Во второй строке записано n неотрицательных чисел, не превосходящих 10 000, –— длины отрезков.

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

Нужно вывести одно число —– наибольший периметр треугольника.
Гарантируется, что тройка чисел, которая может образовать треугольник, всегда есть.

Пример

Ввод Вывод
4
6 3 3 2
8
6
5 3 7 2 8 3
20
G. Гардероб

[Источник] [Решение]

Рита решила оставить у себя одежду только трёх цветов: розового, жёлтого и малинового. После того как вещи других расцветок были убраны, Рита захотела отсортировать свой новый гардероб по цветам. Сначала должны идти вещи розового цвета, потом —– жёлтого, и в конце —– малинового. Помогите Рите справиться с этой задачей.
Примечание: попробуйте решить задачу за один проход по массиву!

Формат ввода

В первой строке задано количество предметов в гардеробе: n –— оно не превосходит 1000000. Во второй строке даётся массив, в котором указан цвет для каждого предмета. Розовый цвет обозначен 0, жёлтый —– 1, малиновый –— 2.

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

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

Пример

Ввод Вывод
7
0 2 1 2 0 0 1
0 0 0 1 1 2 2
5
2 1 2 0 1
0 1 1 2 2
6
2 1 1 2 0 2
0 1 1 2 2 2
H. Большое число

[Источник] [Решение]

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

Формат ввода

В первой строке записано n — количество чисел. Оно не превосходит 100.
Во второй строке через пробел записаны n неотрицательных чисел, каждое из которых не превосходит 1000.

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

Нужно вывести самое большое число, которое можно составить из данных чисел.

Пример

Ввод Вывод
3
15 56 2
56215
3
1 783 2
78321
5
2 4 5 2 10
542210
I. Любители конференций

[Источник] [Решение]

На IT-конференции присутствовали студенты из разных вузов со всей страны. Для каждого студента известен ID университета, в котором он учится.
Тимофей предложил Рите выяснить, из каких k вузов на конференцию пришло больше всего учащихся.

Формат ввода

В первой строке дано количество студентов в списке —– n (1 ≤ n ≤ 15 000).
Во второй строке через пробел записаны n целых чисел —– ID вуза каждого студента. Каждое из чисел находится в диапазоне от 0 до 10 000.
В третьей строке записано одно число k.

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

Выведите через пробел k ID вузов с максимальным числом участников. Они должны быть отсортированы по убыванию популярности (по количеству гостей от конкретного вуза). Если более одного вуза имеет одно и то же количество учащихся, то выводить их ID нужно в порядке возрастания.

Пример

Ввод Вывод
7
1 2 3 1 2 3 4
3
1 2 3
6
1 1 1 2 2 3
1
1
J. Пузырёк

[Источник] [Решение]

Чтобы выбрать самый лучший алгоритм для решения задачи, Гоша продолжил изучать разные сортировки. На очереди сортировка пузырьком — https://ru.wikipedia.org/wiki/Сортировка_пузырьком
Её алгоритм следующий (сортируем по неубыванию):

  1. На каждой итерации проходим по массиву, поочередно сравнивая пары соседних элементов. Если элемент на позиции i больше элемента на позиции i + 1, меняем их местами. После первой итерации самый большой элемент всплывёт в конце массива.
  2. Проходим по массиву, выполняя указанные действия до тех пор, пока на очередной итерации не окажется, что обмены больше не нужны, то есть массив уже отсортирован.
  3. После не более чем n – 1 итераций выполнение алгоритма заканчивается, так как на каждой итерации хотя бы один элемент оказывается на правильной позиции.

Помогите Гоше написать код алгоритма.

Формат ввода

В первой строке на вход подаётся натуральное число n — длина массива, 2 ≤ n ≤ 1000.
Во второй строке через пробел записано n целых чисел.
Каждое из чисел по модулю не превосходит 1000.
Обратите внимание, что считывать нужно только 2 строки: значение n и входной массив.

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

После каждого прохода по массиву, на котором какие-то элементы меняются местами, выводите его промежуточное состояние.
Таким образом, если сортировка завершена за k меняющих массив итераций, то надо вывести k строк по n чисел в каждой — элементы массива после каждой из итераций.
Если массив был изначально отсортирован, то просто выведите его.

Пример

Ввод Вывод
5
4 3 9 2 1
3 4 2 1 9
3 2 1 4 9
2 1 3 4 9
1 2 3 4 9
5
12 8 9 10 11
8 9 10 11 12
K. Сортировка слиянием

[Источник] [Решение]

Гоше дали задание написать красивую сортировку слиянием. Поэтому Гоше обязательно надо реализовать отдельно функцию merge и функцию merge_sort.

  • Функция merge принимает два отсортированных массива, сливает их в один отсортированный массив и возвращает его. Если требуемая сигнатура имеет вид merge(array, left, mid, right), то первый массив задаётся полуинтервалом [left,mid) массива array, а второй – полуинтервалом [mid,right) массива array.
  • Функция merge_sort принимает некоторый подмассив, который нужно отсортировать. Подмассив задаётся полуинтервалом — его началом и концом. Функция должна отсортировать передаваемый в неё подмассив, она ничего не возвращает.
  • Функция merge_sort разбивает полуинтервал на две половинки и рекурсивно вызывает сортировку отдельно для каждой. Затем два отсортированных массива сливаются в один с помощью merge.

Заметьте, что в функции передаются именно полуинтервалы [begin,end), то есть правый конец не включается. Например, если вызвать merge_sort(arr, 0, 4), где arr = [4,5,3,0,1,2], то будут отсортированы только первые четыре элемента, изменённый массив будет выглядеть как arr = [0,3,4,5,1,2].
Реализуйте эти две функции.

Формат ввода

Передаваемый в функции массив состоит из целых чисел, не превосходящих по модулю 10^9. Длина сортируемого диапазона не превосходит 10^5.

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

При написании и отправке решений соблюдайте следующие правила:

merge(arr: list, left: int, mid: int, right: int) -> array
merge_sort(arr: list, left: int, right: int) -> None

L. Два велосипеда

[Источник] [Решение]

Вася решил накопить денег на два одинаковых велосипеда — себе и сестре. У Васи есть копилка, в которую каждый день он может добавлять деньги (если, конечно, у него есть такая финансовая возможность). В процессе накопления Вася не вынимает деньги из копилки.
У вас есть информация о росте Васиных накоплений — сколько у Васи в копилке было денег в каждый из дней.
Ваша задача — по заданной стоимости велосипеда определить

  • первый день, в которой Вася смог бы купить один велосипед,
  • и первый день, в который Вася смог бы купить два велосипеда.

Подсказка: решение должно работать за O(log n).

Формат ввода

В первой строке дано число дней n, по которым велись наблюдения за Васиными накоплениями. 1 ≤ n ≤ 10^6.
В следующей строке записаны n целых неотрицательных чисел. Числа идут в порядке неубывания. Каждое из чисел не превосходит 10^6.
В третьей строке записано целое положительное число s — стоимость велосипеда. Это число не превосходит 10^6.

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

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

Пример

Ввод Вывод
6
1 2 4 4 6 8
3
3 5
6
1 2 4 4 4 4
3
3 -1
6
1 2 4 4 4 4
10
-1 -1
M. Золотая середина

[Источник] [Решение]

Задача повышенной сложности
На каждом острове в архипелаге Алгосы живёт какое-то количество людей или же остров необитаем (тогда на острове живёт 0 людей). Пусть на i-м острове численность населения составляет a_i. Тимофей захотел найти медиану среди всех значений численности населения.
Определение: Медиана (https://ru.wikipedia.org/wiki/Медиана_(статистика)) массива чисел a_i —– это такое число, что половина чисел из массива не больше него, а другая половина не меньше. В общем случае медиану массива можно найти, отсортировав числа и взяв среднее из них. Если количество чисел чётно, то возьмём в качестве медианы полусумму соседних средних чисел, (a[n/2] + a[n/2 + 1])/2.
У Тимофея уже есть отдельно данные по северной части архипелага и по южной, причём значения численности населения в каждой группе отсортированы по неубыванию.
Определите медианную численность населения по всем островам Алгосов.
Подсказка: Если n –— число островов в северной части архипелага, а m –— в южной, то ваше решение должно работать за O(log(n + m)).

Формат ввода

В первой строке записано натуральное число n, во второй —– натуральное число m. Они не превосходят 10 000.
Далее в строку через пробел записаны n целых неотрицательных чисел, каждое из которых не превосходит 10 000, –— значения численности населения в северной части Алгосов.
В последней строке через пробел записаны m целых неотрицательных чисел, каждое из которых не превосходит 10 000 –— значения численности населения в южной части Алгосов.
Значения в третьей и четвёртой строках упорядочены по неубыванию.

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

Нужно вывести одной число — найденную медиану.

Пример

Ввод Вывод
2
1
1 3
2
2
2
2
1 2
3 4
2.5
8
10
0 0 0 1 3 3 5 10
4 4 5 7 7 7 8 9 9 10
5
N. Клумбы

[Источник] [Решение]

Алла захотела, чтобы у неё под окном были узкие клумбы с тюльпанам. На схеме земельного участка клумбы обозначаются просто горизонтальными отрезками, лежащими на одной прямой. Для ландшафтных работ было нанято n садовников. Каждый из них обрабатывал какой-то отрезок на схеме. Процесс был организован не очень хорошо, иногда один и тот же отрезок или его часть могли быть обработаны сразу несколькими садовниками. Таким образом, отрезки, обрабатываемые двумя разными садовниками, сливаются в один. Непрерывный обработанный отрезок затем станет клумбой. Нужно определить границы будущих клумб.
Рассмотрим примеры.
Пример 1:
Даны 4 отрезка: [7,8], [7,8] ,[2,3], [6,10]. Два одинаковых отрезка [7,8] и [7,8] сливаются в один, но потом их накрывает отрезок [6,10]. Таким образом, имеем две клумбы с координатами [2,3] и [6,10].
Пример 2:
Во втором сэмпле опять 4 отрезка: [2,3], [3,4], [3,4], [5,6]. Отрезки [2,3], [3,4] и [3,4] сольются в один отрезок [2,4]. Отрезок [5,6] ни с кем не объединяется, добавляем его в ответ.

Формат ввода

В первой строке задано количество садовников n. Число садовников не превосходит 100000.
В следующих n строках через пробел записаны координаты клумб в формате: start end, где start —– координата начала, end —– координата конца. Оба числа целые, неотрицательные и не превосходят 10^7. start строго меньше, чем end.

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

Нужно вывести координаты каждой из получившихся клумб в отдельных строках. Данные должны выводиться в отсортированном порядке —– сначала клумбы с меньшими координатами, затем —– с бОльшими.

Пример

Ввод Вывод
4
7 8
7 8
2 3
6 10
2 3
6 10
4
2 3
5 6
3 4
3 4
2 4
5 6
6
1 3
3 5
4 6
5 6
2 4
7 10
1 6
7 10
O. Разность треш-индексов

[Источник] [Решение]

Гоша долго путешествовал и измерил площадь каждого из n островов Алгосов, но ему этого мало! Теперь он захотел оценить, насколько разнообразными являются острова в составе архипелага.
Для этого Гоша рассмотрел все пары островов (таких пар, напомним, n * (n-1) / 2) и посчитал попарно разницу площадей между всеми островами. Теперь он собирается упорядочить полученные разницы, чтобы взять k-ую по порядку из них.
Помоги Гоше найти k-ю минимальную разницу между площадями эффективно.

Пояснения к примерам
Пример 1
Выпишем все пары площадей и найдём соответствующие разницы

  1. |2 - 3| = 1
  2. |3 - 4| = 1
  3. |2 - 4| = 2

Так как нам нужна 2-я по величине разница, то ответ будет 1.

Пример 2
У нас есть два одинаковых элемента в массиве —– две единицы, поэтому минимальная (первая) разница равна нулю.

Формат ввода

В первой строке записано натуральное число n –— количество островов в архипелаге (2 ≤ n ≤ 100 000).
В следующей строке через пробел записаны n площадей островов — n натуральных чисел, каждое из которых не превосходит 1 000 000.
В последней строке задано число k. Оно находится в диапазоне от 1 до n(n - 1) / 2.

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

Выведите одно число –— k-ую минимальную разницу.

Пример

Ввод Вывод
3
2 3 4
2
1
3
1 3 1
1
0
3
1 3 5
3
4
P. Частичная сортировка

[Источник] [Решение]

После того, как Гоша узнал про сортировку слиянием и быструю сортировку, он решил придумать свой метод сортировки, который предполагал бы разделение данных на части.
Назвал он свою сортировку Частичной.
Этим методом можно отсортировать n уникальных чисел a_1, a_2, … , a_n, находящихся в диапазоне от 0 до n - 1.
Алгоритм сортировки состоит из трёх шагов:

  • Разбить исходную последовательность на k блоков B_1, …, B_k. Блоки могут иметь разные размеры. Если размер блока i равен s_i, то B_1 ={ a_1, …, a_s1 }, B_2 = { a_s1 + 1, … , a_s1 + s2 } и так далее.
  • Отсортировать каждый из блоков.
  • Объединить блоки — записать сначала отсортированный блок B_1, потом B_2, … , B_k

Частичная сортировка лучше обычной в том случае, если в первом пункте у нас получится разбить последовательность на большое число блоков. Однако далеко не каждое такое разбиение подходит. Определите максимальное число блоков, на которое можно разбить исходную последовательность, чтобы сортировка отработала корректно.
Рассмотрим пример: a = [3, 2, 0, 1, 4, 6, 5].
Минимальный размер первого блока B_1 равен 4. Если взять лишь первые два элемента, то отсортированная последовательность будет начинаться с двойки, что неправильно. Если взять первые три элемента, то последовательность будет начинаться с нуля, но после него сразу же пойдёт двойка. Первые четыре элемента уже гарантируют корректный префикс после объединения блоков. Четвёрку можно взять как самостоятельный блок из одного элемента. Последние два элемента надо объединить в третий блок. Таким образом:
B_1 = { 3, 2, 0, 1 }
B_2 = { 4 }
B_3 = { 6, 5 }
В данном примере ответ равен 3. Максимальное число блоков равно трём.

Формат ввода

В первой строке задано n — количество чисел для сортировки (n ≤ 1000).
В следующей строке записаны числа от 0 до n - 1, которые надо разбить на блоки.

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

Выведите максимальное количество блоков, на которое можно разбить данные при использовании метода Частичной сортировки.

Пример

Ввод Вывод
4
0 1 3 2
3
8
3 6 7 4 1 5 0 2
1
5
1 0 2 3 4
4

Финальные задачи

A. Поиск в сломанном массиве

[Источник] [Решение]

Алла ошиблась при копировании из одной структуры данных в другую. Она хранила массив чисел в кольцевом буфере. Массив был отсортирован по возрастанию, и в нём можно было найти элемент за логарифмическое время. Алла скопировала данные из кольцевого буфера в обычный массив, но сдвинула данные исходной отсортированной последовательности. Теперь массив не является отсортированным. Тем не менее, нужно обеспечить возможность находить в нем элемент за O(log n).
Можно предполагать, что в массиве только уникальные элементы.
От вас требуется реализовать функцию, осуществляющую поиск в сломанном массиве.

Формат ввода

Функция принимает массив натуральных чисел и искомое число k. Длина массива не превосходит 10000. Элементы массива и число k не превосходят по значению 10000.
В примерах:
В первой строке записано число n –— длина массива.
Во второй строке записано положительное число k –— искомый элемент.
Далее в строку через пробел записано n натуральных чисел – элементы массива.

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

Функция должна вернуть индекс элемента, равного k, если такой есть в массиве (нумерация с нуля). Если элемент не найден, функция должна вернуть −1.
Изменять массив нельзя.
Для отсечения неэффективных решений ваша функция будет запускаться от 100000 до 1000000 раз.

Пример

Ввод Вывод
9
5
19 21 100 101 1 4 5 7 12
6
2
1
5 1
1
B. Эффективная быстрая сортировка

[Источник] [Решение]

Тимофей решил организовать соревнование по спортивному программированию, чтобы найти талантливых стажёров. Задачи подобраны, участники зарегистрированы, тесты написаны. Осталось придумать, как в конце соревнования будет определяться победитель.
Каждый участник имеет уникальный логин. Когда соревнование закончится, к нему будут привязаны два показателя: количество решённых задач P_i и размер штрафа F_i. Штраф начисляется за неудачные попытки и время, затраченное на задачу.
Тимофей решил сортировать таблицу результатов следующим образом: при сравнении двух участников выше будет идти тот, у которого решено больше задач. При равенстве числа решённых задач первым идёт участник с меньшим штрафом. Если же и штрафы совпадают, то первым будет тот, у которого логин идёт раньше в алфавитном (лексикографическом) порядке.
Тимофей заказал толстовки для победителей и накануне поехал за ними в магазин. В своё отсутствие он поручил вам реализовать алгоритм быстрой сортировки (англ. quick sort) для таблицы результатов. Так как Тимофей любит спортивное программирование и не любит зря расходовать оперативную память, то ваша реализация сортировки не может потреблять O(n) дополнительной памяти для промежуточных данных (такая модификация быстрой сортировки называется "in-place").
Как работает in-place quick sort
Как и в случае обычной быстрой сортировки, которая использует дополнительную память, необходимо выбрать опорный элемент (англ. pivot), а затем переупорядочить массив. Сделаем так, чтобы сначала шли элементы, не превосходящие опорного, а затем —– большие опорного.
Затем сортировка вызывается рекурсивно для двух полученных частей. Именно на этапе разделения элементов на группы в обычном алгоритме используется дополнительная память. Теперь разберёмся, как реализовать этот шаг in-place.
Пусть мы как-то выбрали опорный элемент. Заведём два указателя left и right, которые изначально будут указывать на левый и правый концы отрезка соответственно. Затем будем двигать левый указатель вправо до тех пор, пока он указывает на элемент, меньший опорного. Аналогично двигаем правый указатель влево, пока он стоит на элементе, превосходящем опорный. В итоге окажется, что что левее от left все элементы точно принадлежат первой группе, а правее от right — второй. Элементы, на которых стоят указатели, нарушают порядок. Поменяем их местами (в большинстве языков программирования используется функция swap()) и продвинем указатели на следующие элементы. Будем повторять это действие до тех пор, пока left и right не столкнутся.
На рисунке представлен пример разделения при pivot=5. Указатель left — голубой, right — оранжевый.

Формат ввода

В первой строке задано число участников n, 1 ≤ n ≤ 100 000.
В каждой из следующих n строк задана информация про одного из участников.
i-й участник описывается тремя параметрами:

  • уникальным логином (строкой из маленьких латинских букв длиной не более 20)
  • числом решённых задач P_i
  • штрафом F_i

F_i и P_i — целые числа, лежащие в диапазоне от 0 до 10^9.

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

Для отсортированного списка участников выведите по порядку их логины по одному в строке.

Пример

Ввод Вывод
5
alla 4 100
gena 6 1000
gosha 2 90
rita 2 90
timofey 4 80
gena
timofey
alla
gosha
rita
5
alla 0 0
gena 0 0
gosha 0 0
rita 0 0
timofey 0 0
alla
gena
gosha
rita
timofey

Бонус 1: Хеш-функции

A. Полиномиальный хеш

[Источник] [Решение]

Алле очень понравился алгоритм вычисления полиномиального хеша. Помогите ей написать функцию, вычисляющую хеш строки s. В данной задаче необходимо использовать в качестве значений отдельных символов их коды в таблице ASCII.
Полиномиальный хеш считается по формуле:

h(s) = (s_1 * a^n-1 + s_2 * a^n-2 + ... + s_n-1 * a + s_n) mod m

Формат ввода

В первой строке дано число a (1 ≤ a ≤ 1000) –— основание, по которому считается хеш.
Во второй строке дано число m (1 ≤ m ≤ 10^9) –— модуль.
В третьей строке дана строка s (0 ≤ |s| ≤ 10^6), состоящая из больших и маленьких латинских букв.

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

Выведите целое неотрицательное число –— хеш заданной строки.

Пример

Ввод Вывод
123
100003
a
97
123
100003
hash
6080
123
100003
HaSH
56156
B. Сломай меня

[Источник] [Решение]

Гоша написал программу, которая сравнивает строки исключительно по их хешам. Если хеш равен, то и строки равны. Тимофей увидел это безобразие и поручил вам сломать программу Гоши, чтобы остальным неповадно было.
В этой задаче вам надо будет лишь найти две различные строки, которые для заданной хеш-функции будут давать одинаковое значение.
Гоша использует следующую хеш-функцию:

h(s) = (s_1 * a^n-1 + s_2 * a^n-2 + ... + s_n-1 * a + s_n) mod m

для a = 1000 и m = 123 987 123.
В данной задаче необходимо использовать в качестве значений отдельных символов их коды в таблице ASCII.

Формат ввода

В задаче единственный тест без ввода

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

Отправьте две строки, по одной в строке. Строки могут состоять только из маленьких латинских букв и не должны превышать в длину 1000 знаков каждая. Код отправлять не требуется. Строки из примера использовать нельзя.
Пример вывода:
ezhgeljkablzwnvuwqvp
gbpdcvkumyfxillgnqrv

C. Префиксные хеши

[Источник] [Решение]

Алла не остановилась на достигнутом –— теперь она хочет научиться быстро вычислять хеши произвольных подстрок данной строки. Помогите ей!
На вход поступают запросы на подсчёт хешей разных подстрок. Ответ на каждый запрос должен выполняться за O(1). Допустимо в начале работы программы сделать предподсчёт для дальнейшей работы со строкой.
Напомним, что полиномиальный хеш считается по формуле

h(s) = (s_1 * a^n-1 + s_2 * a^n-2 + ... + s_n-1 * a + s_n) mod m

В данной задаче необходимо использовать в качестве значений отдельных символов их коды в таблице ASCII.

Формат ввода

В первой строке дано число a (1 ≤ a ≤ 1000) –— основание, по которому считается хеш. Во второй строке дано число m (1 ≤ m ≤ 10^7) –— модуль. В третьей строке дана строка s (0 ≤ |s| ≤ 10^6), состоящая из больших и маленьких латинских букв.
В четвертой строке дано число запросов t –— натуральное число от 1 до 10^5. В каждой из следующих t строк записаны через пробел два числа l и r –— индексы начала и конца очередной подстроки. (1 ≤ l ≤ r ≤ |s|).

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

Для каждого запроса выведите на отдельной строке хеш заданной в запросе подстроки.

Пример

Ввод Вывод
1000
1000009
abcdefgh
7
1 1
1 5
2 3
3 4
4 4
1 8
5 8
97
225076
98099
99100
100
436420
193195
100
10
a
1
1 1
7
D. Кружки

[Источник] [Решение]

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

Формат ввода

В первой строке даётся натуральное число n, не превосходящее 10 000 –— количество записей в логе.
В следующих n строках —– названия кружков.

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

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

Пример

Ввод Вывод
8
вышивание крестиком
рисование мелками на парте
настольный керлинг
настольный керлинг
кухня африканского племени ужасмай
тяжелая атлетика
таракановедение
таракановедение
вышивание крестиком
рисование мелками на парте
настольный керлинг
кухня африканского племени ужасмай
тяжелая атлетика
таракановедение
E. Подстроки

[Источник] [Решение]

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

Формат ввода

Одна строка, состоящая из строчных латинских букв. Длина строки не превосходит 10 000.

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

Выведите натуральное число —– ответ на задачу.

Пример

Ввод Вывод
abcabcbb 3
bbbbb 1
F. Анаграммная группировка

[Источник] [Решение]

Вася решил избавиться от проблем с произношением и стать певцом. Он обратился за помощью к логопеду. Тот посоветовал Васе выполнять упражнение, которое называется анаграммная группировка. В качестве подготовительного этапа нужно выбрать из множества строк анаграммы.
Анаграммы –— это строки, которые получаются друг из друга перестановкой символов. Например, строки «SILENT» и «LISTEN» являются анаграммами.
Помогите Васе найти анаграммы.

Формат ввода

В первой строке записано число n —– количество строк.
Далее в строку через пробел записаны n строк.
n не превосходит 6000. Длина каждой строки не более 100 символов.

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

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

Пример

Ввод Вывод
6
tan eat tea ate nat bat
0 4
1 2 3
5
G. Соревнование

[Источник] [Решение]

Жители Алгосов любят устраивать турниры по спортивному программированию. Все участники разбиваются на пары и соревнуются друг с другом. А потом два самых сильных программиста встречаются в финальной схватке, которая состоит из нескольких раундов. Если в очередном раунде выигрывает первый участник, в таблицу с результатами записывается 0, если второй, то 1. Ничьей в раунде быть не может.
Нужно определить наибольший по длине непрерывный отрезок раундов, по результатам которого суммарно получается ничья. Например, если дана последовательность 0 0 1 0 1 1 1 0 0 0, то раунды с 2-го по 9-й (нумерация начинается с единицы) дают ничью.

Формат ввода

В первой строке задаётся n (0 ≤ n ≤ 10^5) –— количество раундов. Во второй строке через пробел записано n чисел –— результаты раундов. Каждое число равно либо 0, либо 1.

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

Выведите длину найденного отрезка.

Пример

Ввод Вывод
2
0 1
2
3
0 1 0
2
H. Странное сравнение

[Источник] [Решение]

Жители Алгосского архипелага придумали новый способ сравнения строк. Две строки считаются равными, если символы одной из них можно заменить на символы другой так, что первая строка станет точной копией второй строки. При этом необходимо соблюдение двух условий:

  • Порядок вхождения символов должен быть сохранён.
  • Одинаковым символам первой строки должны соответствовать одинаковые символы второй строки. Разным символам —– разные.

Например, если строка s = «abacaba», то ей будет равна строка t = «xhxixhx», так как все вхождения «a» заменены на «x», «b» –— на «h», а «c» –— на «i». Если же первая строка s=«abc», а вторая t=«aaa», то строки уже не будут равны, так как разные буквы первой строки соответствуют одинаковым буквам второй.

Формат ввода

В первой строке записана строка s, во второй –— строка t. Длины обеих строк не превосходят 106. Обе строки содержат хотя бы по одному символу и состоят только из маленьких латинских букв.
Строки могут быть разной длины.

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

Выведите «YES», если строки равны (согласно вышеописанным правилам), и «NO» в ином случае.

Пример

Ввод Вывод
mxyskaoghi
qodfrgmslc
YES
agg
xdd
YES
agg
xda
NO
I. Общий подмассив

[Источник] [Решение]

Гоша увлёкся хоккеем и часто смотрит трансляции матчей. Чтобы более-менее разумно оценивать силы команд, он сравнивает очки, набранные во всех матчах каждой командой.
Гоша попросил вас написать программу, которая по результатам игр двух выбранных команд найдёт наибольший по длине отрезок матчей, когда эти команды зарабатывали одинаковые очки.
Рассмотрим первый пример:
Результаты первой команды: [1 2 3 2 1].
Результаты второй команды: [3 2 1 5 6].
Наиболее продолжительный общий отрезок этих массивов имеет длину 3 –— это [3 2 1].

Формат ввода

В первой строке находится число n (1 ≤ n ≤ 10^5) –— количество матчей, которые были сыграны первой командой.
Во второй строке записано n целых чисел –— очки в этих играх.
В третьей строке дано число m (1 ≤ m ≤ 10^5) —– количество матчей, которые сыграла вторая команда.
В четвертой строке заданы m целых чисел —– результаты второй команды.
Число очков, заработанных в одной игре, лежит в диапазоне от 0 до 255.

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

Выведите целое неотрицательное число —– максимальное количество матчей подряд, в которых команды зарабатывали одинаковые очки.

Пример

Ввод Вывод
5
1 2 3 2 1
5
3 2 1 5 6
3
5
1 2 3 4 5
3
4 5 9
2
J. Сумма четвёрок

[Источник] [Решение]

У Гоши есть любимое число S. Помогите ему найти все уникальные четвёрки чисел в массиве, которые в сумме дают заданное число S.

Формат ввода

В первой строке дано общее количество элементов массива n (0 ≤ n ≤ 1000).
Во второй строке дано целое число S: |S| ≤ 10^9.
В третьей строке задан сам массив. Каждое число является целым и не превосходит по модулю 10^9.

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

В первой строке выведите количество найденных четвёрок чисел.
В последующих строках выведите найденные четвёрки. Числа внутри одной четверки должны быть упорядочены по возрастанию. Между собой четвёрки упорядочены лексикографически.

Пример

Ввод Вывод
8
10
2 3 2 4 1 10 3 0
3
0 3 3 4
1 2 3 4
2 2 3 3
6
0
1 0 -1 0 2 -2
3
-2 -1 1 2
-2 0 0 2
-1 0 0 1
5
4
1 1 1 1 1
1
1 1 1 1
K. Ближайшая остановка

[Источник] [Решение]

Гоша едет в гости к друзьям. Ему придётся сначала ехать на метро, а потом пересаживаться на автобус. Гоша не любит долго ждать, поэтому хочет выбрать такую станцию метро, рядом с которой расположено как можно больше остановок автобуса. Гоша считает, что остановка находится рядом с метро, если расстояние между ними не превосходит 20 метров. Обратите внимание, что в одной точке могут располагаться несколько остановок.
Гоше известны все координаты автобусных остановок и координаты выходов из метро. Помогите ему найти выход из метро, рядом с которым расположено больше всего остановок.
Напомним, что расстояние между двумя точками с координатами x_1, y_1 и x_2, y_2 вычисляется по формуле sqrt((x_1 - x_2)^2 + (y_1 - y_2)^2).
Пояснение к примеру 1:
Рядом с 1-м выходом (-1, 0) находится только остановка с координатами (10, 0).
Рядом со 2-м выходом (1, 0) находятся уже две остановки —– (10, 0) и (20, 0).
Рядом с 3-м выходом (2, 5) расположены все три остановки –— (22, 5), (20, 0) и (10, 0)
Пояснение к примеру 2:
Третий выход теперь находится в точке (0, 5). Он рядом только с двумя остановками — (20, 5) и (10, 0).
Рядом с 2-м и 3-м выходом одинаковое число остановок, поэтому в ответ идет 2-й выход, так как он раньше во входных данных.

Формат ввода

В первой строке дано количество выходов из метро –— натуральное число n (1 ≤ n ≤ 10^4). В следующих n строках даны координаты выходов из метро. Каждый выход описывается двумя координатами x и y, записанными через пробел.
В следующей строке дано количество автобусных остановок —– натуральное число m (1 ≤ m ≤ 10^6). В следующих m строках заданы координаты остановок. Каждая остановка описывается двумя числами —– своими x и y координатами, записанными через пробел.
Все координаты —– целые числа, не превосходящие 109 по модулю. Единицы измерения —– метры.

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

Выведите единственное число –— номер того выхода из метро, рядом с которым расположено больше всего остановок. Номер выхода –— его порядковый номер во входных данных (нумерация с единицы).
Если подходящих выходов из метро несколько, выведите тот, который встречается раньше во входных данных.

Пример

Ввод Вывод
3
-1 0
1 0
2 5
3
10 0
20 0
22 5
3
3
-1 0
1 0
0 5
3
10 0
20 0
20 5
2
L. МногоГоша

[Источник] [Решение]

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

Формат ввода

В первой строчке через пробел записаны два натуральных числа n и k.
Во второй строчке записана строка, состоящая из маленьких латинских букв. Длина строки 1 ≤ L ≤ 10^6.
n ≤ L, k ≤ L.

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

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

Пример

Ввод Вывод
10 2
gggggooooogggggoooooogggggssshaa
0 5
3 4
allallallallalla
0 1 2

Бонус 2: Деревья

A. Лампочки

[Источник] [Решение]

Гоша повесил на стену гирлянду в виде бинарного дерева, в узлах которого находятся лампочки. У каждой лампочки есть своя яркость. Уровень яркости лампочки соответствует числу, расположенному в узле дерева. Помогите Гоше найти самую яркую лампочку в гирлянде, то есть такую, у которой яркость наибольшая.

Формат ввода

На вход подается корень дерева.

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

Функция должна вернуть максимальное значение яркости в узле дерева.

B. Сбалансированное дерево

[Источник] [Решение]

Гоше очень понравилось слушать рассказ Тимофея про деревья. Особенно часть про сбалансированные деревья. Он решил написать функцию, которая определяет, сбалансировано ли дерево.
Дерево считается сбалансированным, если левое и правое поддеревья каждой вершины отличаются по высоте не больше, чем на единицу.

Формат ввода

На вход функции подаётся корень бинарного дерева.

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

Функция должна вернуть True, если дерево сбалансировано в соответствии с критерием из условия, иначе - False.

C. Дерево - анаграмма

[Источник] [Решение]

Гоша и Алла играют в игру «Удивительные деревья». Помогите ребятам определить, является ли дерево, которое им встретилось, деревом-анаграммой?
Дерево называется анаграммой, если оно симметрично относительно своего центра.

Формат ввода

Напишите функцию, которая определяет, является ли дерево анаграммой.
На вход подаётся корень дерева.

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

Функция должна вернуть True если дерево является анаграммой. Иначе - False.

D. Деревья - близнецы

[Источник] [Решение]

Гоше на день рождения подарили два дерева. Тимофей сказал, что они совершенно одинаковые. Но, по мнению Гоши, они отличаются.
Помогите разрешить этот философский спор!

Формат ввода

На вход подаются корни двух деревьев.

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

Функция должна вернуть True если деревья являются близнецами. Иначе - False.

E. Дерево поиска

[Источник] [Решение]

Гоша понял, что такое дерево поиска, и захотел написать функцию, которая определяет, является ли заданное дерево деревом поиска. Значения в левом поддереве должны быть строго меньше, в правом —- строго больше значения в узле.
Помогите Гоше с реализацией этого алгоритма.

Формат ввода

На вход функции подается корень бинарного дерева.

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

Функция должна вернуть True, если дерево является деревом поиска, иначе - False.

F. Максимальная глубина

[Источник] [Решение]

Алла хочет побывать на разных островах архипелага Алгосы. Она составила карту. Карта представлена в виде дерева: корень обозначает центр архипелага, узлы –— другие острова. А листья —– это дальние острова, на которые Алла хочет попасть.
Помогите Алле определить максимальное число островов, через которые ей нужно пройти для совершения одной поездки от стартового острова до места назначения, включая начальный и конечный пункты.

Формат ввода

На вход подается корень дерева.

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

Функция должна вернуть число, равное максимальному числу островов в пути (включая начальный и конечный пункты).

G. Максимальный путь в дереве

[Источник] [Решение]

Тимофей устраивает соревнования по спортивному ориентированию в своём офисе. Схема офиса представлена в виде дерева. Посещая каждый пункт, можно зарабатывать или терять очки. Если в узле записано положительное число, это значение добавляется к текущему количеству очков участника. Если отрицательное —– очки вычитаются. Если 0 –— их количество не меняется.
Нужно определить, какое максимальное число очков можно заработать, пройдя по пути из какого-то пункта A в какой-то (возможно, тот же) пункт B.
Путь не обязательно должен проходить через корень или содержать лист. Путь должен содержать по крайней мере один узел.
Пример 1:
В дереве всего три вершины, во всех вершинах записаны положительные числа, поэтому объединим все три вершины в один путь. В ответе получим: 1+1+2=4.
Пример 2:
Теперь в дереве есть вершина с отрицательным весом, через неё в данном случае проходить будет невыгодно. Оптимальный путь: 2+7+3=12.
Пример 3:
Оптимальный путь: 7+2+3+9=21.
Пример 4:
В этот раз имеет смысл пройти через вершину с отрицательным весом, так как в левом поддереве вершины −3 лежит 5. Оптимальный путь: 2+2−3+5=6.
Требования к решению: передаваемое в качестве аргумента дерево нельзя менять. Не храните вспомогательную информацию в вершинах.

Формат ввода

На вход подается корень дерева.

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

Функция должна вернуть число, равное максимальному количеству очков, которое можно заработать, попав из пункта А в пункт В.

H. Числовые пути

[Источник] [Решение]

Вася и его друзья решили поиграть в игру. Дано дерево, в узлах которого записаны цифры от 0 до 9. Таким образом, каждый путь от корня до листа содержит число, получившееся конкатенацией цифр пути (склеиванием цифр пути в одно число). Нужно найти сумму всех таких чисел в дереве.
Гарантируется, что ответ не превосходит 20 000.

Формат ввода

На вход подается корень дерева.

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

Функция должна вернуть число, равное сумме чисел всех путей в дереве.

I. Разные деревья поиска

[Источник] [Решение]

Ребятам стало интересно, сколько может быть различных деревьев поиска, содержащих в своих узлах все уникальные числа от 1 до n. Помогите им найти ответ на этот вопрос.

Формат ввода

В единственной строке задано число n. Оно не превосходит 20.

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

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

Пример

Ввод Вывод
2 2
3 5
4 14
J. Добавь узел

[Источник] [Решение]

Дано BST. Надо вставить узел с заданным ключом. Ключи в дереве могут повторяться.
На вход функции подаётся корень корректного бинарного дерева поиска и ключ, который надо вставить в дерево. Осуществите вставку этого ключа. Если ключ уже есть в дереве, то его дубликаты уходят в правого сына. Таким образом вид дерева после вставки определяется однозначно. Функция должна вернуть корень дерева после вставки вершины.
Ваше решение должно работать за O(h), где h –— высота дерева.
На рисунках ниже даны два примера вставки вершин в дерево.

Формат ввода

Ключи дерева – натуральные числа, не превосходящие 10^9. Число вершин в дереве не превосходит 10^5.

K. Выведи диапазон

[Источник] [Решение]

Напишите функцию, которая будет выводить по неубыванию все ключи от L до R включительно в заданном бинарном дереве поиска.
Ключи в дереве могут повторяться. Решение должно иметь сложность O(h+k), где h –— глубина дерева, k — число элементов в ответе.
В данной задаче если в узле содержится ключ x, то другие ключи, равные x, могут быть как в правом, так и в левом поддереве данного узла. (Дерево строил стажёр, так что ничего страшного).

Формат ввода

На вход функции подаётся корень дерева и искомый ключ. Число вершин в дереве не превосходит 10^5. Ключи – натуральные числа, не превосходящие 10^9. Гарантируется, что L ≤ R.
В итоговом решении не надо определять свою структуру / свой класс, описывающий вершину дерева.

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

Функция должна напечатать по неубыванию все ключи от L до R по одному в строке.

L. Просеивание вниз

[Источник] [Решение]

Напишите функцию, совершающую просеивание вниз в куче на максимум. Гарантируется, что порядок элементов в куче может быть нарушен только элементом, от которого запускается просеивание.
Функция принимает в качестве аргументов массив, в котором хранятся элементы кучи, и индекс элемента, от которого надо сделать просеивание вниз. Функция должна вернуть индекс, на котором элемент оказался после просеивания. Также необходимо изменить порядок элементов в переданном в функцию массиве.
Индексация в массиве, содержащем кучу, начинается с единицы. Таким образом, сыновья вершины на позиции v это 2v и 2v+1. Обратите внимание, что нулевой элемент в передаваемом массиве фиктивный, вершина кучи соответствует 1-му элементу.

Формат ввода

Элементы кучи —– целые числа, лежащие в диапазоне от −10^9 до 10^9. Все элементы кучи уникальны. Передаваемый в функцию индекс лежит в диапазоне от 1 до размера передаваемого массива. В куче содержится от 1 до 10^5 элементов.

M. Просеивание вверх

[Источник] [Решение]

Напишите функцию, совершающую просеивание вверх в куче на максимум. Гарантируется, что порядок элементов в куче может быть нарушен только элементом, от которого запускается просеивание.
Функция принимает в качестве аргументов массив, в котором хранятся элементы кучи, и индекс элемента, от которого надо сделать просеивание вверх. Функция должна вернуть индекс, на котором элемент оказался после просеивания. Также необходимо изменить порядок элементов в переданном в функцию массиве.
Индексация в массиве, содержащем кучу, начинается с единицы. Таким образом, сыновья вершины на позиции v это 2v и 2v+1. Обратите внимание, что нулевой элемент в передаваемом массиве фиктивный, вершина кучи соответствует 1-му элементу.

Формат ввода

Элементы кучи —– целые числа, лежащие в диапазоне от −10^9 до 10^9. Все элементы кучи уникальны. Передаваемый в функцию индекс лежит в диапазоне от 1 до размера передаваемого массива. В куче содержится от 1 до 10^5 элементов.

N. Разбиение дерева

[Источник] [Решение]

Дано бинарное дерево поиска, в котором хранятся целые числа. От этого дерева надо отделить k самых маленьких элементов.
Реализуйте функцию, которая принимает корень дерева и число k, а возвращает два BST — в первом k наименьших элементов из исходного дерева, а во втором — оставшиеся вершины BST.
В вершинах дерева уже записаны корректные размеры поддеревьев (точное название поля смотрите в заготовках кода). После разбиения размеры должны остаться корректными — вам придётся пересчитывать их на ходу.
Ваше решение должно иметь асимптотику O(h), где h — высота исходного дерева.

Формат ввода

Числа, записанные в вершинах дерева, лежат в диапазоне от 0 до 10^9. Дерево не содержит одинаковых ключей.
Число вершин в дереве не превосходит 10^5.

Открытый лекторий: Набор 1

A. Строительство лесенок

[Источник] [Решение]

Вася занимается строительством лесенок из блоков. Лесенка состоит из ступенек, при этом i-ая ступенька должна состоять ровно из i блоков.
По заданному числу блоков n определите максимальное количество ступенек в лесенке, которую можно построить из этих блоков.

Формат ввода

Ввводится одно число n (1 ≤ n ≤ 2^31 - 1).

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

Выведите одно число — количество ступенек в лесенке.

Пример

Ввод Вывод
5 2
8 3

Примечания

Рисунок соответствует примерам. На рисунке черным показаны блоки, использованные при строительстве лестницы, а красным — оставшиеся лишними блоки, которых недостаточно для строительства очередной ступеньки.

B. Канонический путь

[Источник] [Решение]

По заданной строке, являющейся абсолютным адресом в Unix-системе, вам необходимо получить канонический адрес.
В Unix-системе "." соответсвутет текущей директории, ".." — родительской директории, при этом будем считать, что любое количество точек подряд, большее двух, соответствует директории с таким названием (состоящем из точек). "/" является разделителем вложенных директорий, причем несколько "/" подряд должны интерпретироваться как один "/".
Канонический путь должен обладать следующими свойствами:

  1. всегда начинаться с одного "/"
  2. любые две вложенные директории разделяются ровно одним знаком "/"
  3. путь не заканчивается "/" (за исключением корневой директории, состоящего только из символа "/")
  4. в каноническом пути есть только директории, т.е. нет ни одного вхождения "." или ".." как соответствия текущей или родительской директории

Формат ввода

Вводится строка с абсолютным адресом, её длина не превосходит 100.

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

Выведите канонический путь.

Пример

Ввод Вывод
/home/ /home
/../ /
/home//foo/ /home/foo
C. Купить и продать

[Источник] [Решение]

У вас есть 1000$, которую вы планируете эффективно вложить. Вам даны цены за 1000 кубометров газа за n дней. Можно один раз купить газ на все деньги в день i и продать его в один из последующих дней j, i < j.
Определите номера дней для покупки и продажи газа для получения максимальной прибыли.

Формат ввода

В первой строке вводится число дней n (1 ≤ n ≤ 100000).
Во второй строке вводится n чисел — цены за 1000 кубометров газа в каждый из дней. Цена — целое число от 1 до 5000. Дни нумеруются с единицы.

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

Выведите два числа i и j — номера дней для покупки и продажи газа. Если прибыль получить невозможно, выведите два нуля.

Пример

Ввод Вывод
6
10 3 5 3 11 9
2 5
4
5 5 5 5
0 0
D. Разница во времени

[Источник] [Решение]

Каждые сутки на вокзал прибывает n электричек. По заданному расписанию прибытия электричек определите минимальное время между прибытием двух разных электричек.

Формат ввода

В первой строке задано число n (1 ≤ n ≤ 2 × 10^4) — количество электричек.
Во второй строке задано n моментов времени в формате HH:MM (0 ≤ HH ≤ 23, 0 ≤ MM ≤ 59) через пробел.

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

Выведите одно число — минимальное время в минутах между прибытием двух электричек.

Пример

Ввод Вывод
2
23:59 00:00
1
3
00:00 23:59 00:00
0
E. Сломай палиндром

[Источник] [Решение]

Палиндромом называется строка, которая читается одинаково слева-направо и справа-налево.
В заданной строке-палиндроме необходимо заменить один символ, чтобы она перестала быть палиндромом. При этом полученная строка должна быть лексикографически минимальной.
Строка A лексикографически меньше строки B (той же длины), если на первой различающейся позиции в строке A стоит меньший символ, чем в B. Например, строка adbc меньше строки adca, т.к. первые два символа в строках совпадают, а на третьем месте в строке adbc стоит символ b, который меньше символа c, стоящего на третьей позиции в строке adca.

Формат ввода

Вводится строка-палиндром, состоящая из маленьких букв латинского алфавита. Длина строки не превосходит 1000.

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

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

Пример

Ввод Вывод
abba aaba
a

Открытый лекторий: Набор 2

A. Повторяющееся число

[Источник] [Решение]

Вам дана последовательность измерений некоторой величины. Требуется определить, повторялась ли какое-либо число, причём расстояние между повторами не превосходило k.

Формат ввода

В первой строке задаются два числа n и k (1 ≤ n, k ≤ 10^5).
Во второй строке задаются n чисел, по модулю не превосходящих 10^9.

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

Выведите YES, если найдется повторяющееся число и расстояние между повторами не превосходит k и NO в противном случае.

Пример

Ввод Вывод
4 2
1 2 3 1
NO
4 1
1 0 1 1
YES
6 2
1 2 3 1 2 3
NO
B. Разноцветные палочки

[Источник] [Решение]

Есть 10 вертикальных палочек, пронумерованных от 0 до 9 и n колец трёх цветов красного «R», зеленого «G» и голубого «B», которые на надеты на палочки. Ваша задача по строке s, кодирующей, где находится каждое из колец определить количество палочек, на которое надеты кольца всех трёх цветов.
Строка представляет из себя последовательность чётной длины, где на нечётных позициях (1, 3, 5 и т.д.) написан цвет кольца, а на чётных позициях (2, 4, 6 и т.д.) — номер палочки, на которую надето кольцо. Таким образом, кольцо номер i имеет цвет s_2i−1 и находится на палочке номер s_2i.
Например, строка «R2G1R1B2G2» кодирует 5 колец:

  • Первое кольцо имеет красный цвет и находится на палочке 2;
  • Второе кольцо имеет зеленый цвет и находится на палочке 1;
  • Третье кольцо имеет красный цвет и находится на палочке 1;
  • Четвертое кольцо имеет синий цвет и находится на палочке 2;
  • Пятое кольцо имеет зеленый цвет и находится на палочке 2;

Формат ввода

Первая строка входных данных — это непустая строка четной длины s (1 ≤ |s| ≤ 1000), состоящая из символов «R», «G» или «B» и цифр от 0 до 9.

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

Выведите единственное целое число — количество палочек, на которых имеются кольца всех трёх цветов.

Пример

Ввод Вывод
R2G1R1B2G2 1
R9G1B0 0
C. Замена слов

[Источник] [Решение]

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

Формат ввода

В первой строке через пробел вводятся слова из словаря, слова состоят из маленьких латинских букв. Гарантируется, что словарь не пуст и количество слов в словаре не превышет 1000, а длина слов — 100 символов.
Во второй строке через пробел вводятся слова текста (они также состоят только из маленьких латинских букв). Количество слов в тексте не превосходит 10^5, а суммарное количество букв в них — 10^6.

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

Выведите текст, в котором осуществлены замены.

Пример

Ввод Вывод
a b
abdafb basrt casds dsasa a
a b casds dsasa a
aa bc aaa
a aa aaa bcd abcd
a aa aa bc abcd
D. Majority

[Источник] [Решение]

Majority (в дословном переводе "большинство") — это значение элемента, который в массиве длиной n встречается более чем n / 2 раз. Определите majority массива, если гарантируется, что такой элемент существует.

Формат ввода

В первой строке вводится число n (1 ≤ n ≤ 5 × 10^4).
Во второй строке вводится n чисел через пробел, числа не превосходят 10^9 по модулю.

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

Выведите majority массива.

Пример

Ввод Вывод
3
1 2 1
1
7
7 5 5 5 5 4 5
5
4
3 3 3 1
3
E. Удаление чисел

[Источник] [Решение]

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

Формат ввода

Первая строка содержит одно целое число n (1 ≤ n ≤ 2 * 10^5) — количество элементов массива a.
Вторая строка содержит n целых чисел a_1,a_2,…,a_n (0 ≤ a_i ≤ 10^5) — элементы массива a.

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

Выведите одно число — ответ на задачу.

Пример

Ввод Вывод
5
1 2 3 4 5
3
10
1 1 2 3 5 5 2 2 1 5
4

Открытый лекторий: Набор 3

A. Количество положительных на отрезке

[Источник] [Решение]

Дана последовательность чисел и запросы вида "определите сколько положительных чисел на отрезке с индексами от L до R".

Формат ввода

В первой строке вводится число n (1 ≤ n ≤ 100000) — длина последовательности.
Во второй строке вводится последовательность из n целых чисел, все числа по модулю не превосходят 100000. Нумерация в последовательности начинается с единицы.
В первой строке вводится число q (1 ≤ q ≤ 100000) — количество запросов.
В каждой из следующих q строк вводятся запросы — два индекса l и r (1 ≤ l ≤ r ≤ n)

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

Для каждого запроса выведите количество положительных на отрезке.

Пример

Ввод Вывод
5
2 -1 2 -2 3
4
1 1
1 3
2 4
1 5
1
2
1
3
B. Бумеры и зумеры

[Источник] [Решение]

Площадка для выгула собак — место, где собираются и общаются люди разных возрастов. На одной из площадок Восточного Бирюлева хозяева собак очень дружны и приглашают друг-друга на день рождения.
Человек x не приглашает на день рождения человека y если выполнено хотя бы одно из условий:

  • (Возраст человека y) <= 0.5 * (Возраст человека x) + 7
  • (Возраст человека y) > (Возраст человека x)
  • (Возраст человека y) > 100 и одновременно с этим (Возраст человека x) < 100

Во всех остальных случаях человек x приглашает человека y на день рождения.
Определите суммарное количество приглашений на день рождения.

Формат ввода

В первой строке вводится число n (1 ≤ n ≤ 100000).
Во второй строке вводится n чисел — возраст людей. Возраст находится в промежутке от 1 до 120.

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

Выведите одно число — суммарное количество приглашений.

Пример

Ввод Вывод
2
16 16
2
3
17 16 18
2
5
120 25 30 100 105
4
C. Гирлянды

[Источник] [Решение]

На завод по изготовлению гирлянд пришел срочный заказ: изготовить как можно больше одинаковых гирлянд, состоящих из n лампочек. На складе завода есть лампочки k различных цветов, цвета занумерованы от 1 до k. Определите, сколько гирлянд сможет изготовить завод и из каких лампочек должна состоять каждая гирлянда.

Формат ввода

В первой строке задаются два числа n (1 ≤ n ≤ 40000) и k (1 ≤ k ≤ 50000).
В следующих k строках задается количество лампочек каждого из k цветов. Суммарное количество лампочек на складе не превосходит 2 × 10^9.

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

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

Пример

Ввод Вывод
3 4
3
3
2
1
2
1
2
3
D. Коровы в стойла

[Источник] [Решение]

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

Формат ввода

В первой строке вводятся числа N (2 < N < 10001) – количество стойл и K (1 < K < N) – количество коров. Во второй строке задаются N натуральных чисел в порядке возрастания – координаты стойл (координаты не превосходят 10^9)

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

Выведите одно число – наибольшее возможное допустимое расстояние.

Пример

Ввод Вывод
6 3
2 5 7 11 15 20
9
E. Варим зелья

[Источник] [Решение]

Богдан учится в Хогвартсе на факультете зельеварения. Завтра ему сдавать свой выпускной проект, но он ничего не успел подготовить. У него есть n ингредиентов, из которых можно сварить зелья. Зелье может состоять либо из одного ингредиента, либо из двух различных. Каждое зелье характеризуется его полезностью. Полезность — это целое число от −10^6 до 10^6. Богдану нужно сварить k зелий так, чтобы их суммарная полезность была максимальной (полезность зелья — это сумма полезностей ингредиентов, из которых оно состоит). Очень важно, чтобы все зелья в проекте были различны. Два зелья считаются различными, если найдется хотя бы один ингредиент, который отсутствует в одном зелье, но присутствует в другом. Помогите Богдану с проектом и подсчитайте максимальную суммарную полезность зелий, которую он может получить.

Формат ввода

В первой строке записано два числа n и k (1 ≤ n ≤ 10^5, 1 ≤ k ≤ n*(n+1)/2) - количество ингредиентов и количество зелий, которые нужно приготовить.
В следующей строке заданы n целых чисел ai (−10^6 ≤ a_i ≤ 10^6) — полезность ингредиентов.

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

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

Пример

Ввод Вывод
5 5
-2 3 -5 5 1
26
2 1
-1 1
1

Открытый лекторий: Набор 4

A. Группы и аудитории

[Источник] [Решение]

В университете есть n аудиторий и m учебных групп. Для каждой аудитории задана её вместимость, а для каждой группы — численность. Группа может заниматься в аудитории только если её численность не превосходит размера аудитории. Определите максимальное количество групп, которые можно рассадить по аудиториям.

Формат ввода

В первой строке вводится число n (1 ≤ n ≤ 100000).
Во второй строке вводится n чисел — численность групп. Численность не превосходит 100000.
В третьей строке вводится число m (1 ≤ m ≤ 100000).
В четвертой строке вводится m чисел — вместимость аудиторий. Вместимость не превосходит 100000.

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

Выведите ответ на задачу.

Пример

Ввод Вывод
3
3 1 2
2
1 1
1
2
1 2
3
3 2 1
2
B. Гости

[Источник] [Решение]

Вася переехал из своего родного города и очень скучает по старым друзьям. К сожалению, Вася снимает маленькую квартиру и одновременно в гости к нему может приехать только один друг.
Каждый друг сказал Васе два числа A и B — с какого по какой день он может приехать в гости. Каждый друг приезжает и уезжает в полдень. Каждый друг может приехать к Васе только один раз и остаться у него на несколько дней. Вася хотел бы, чтобы суммарное количество дней, когда у него в гостях есть кто-нибудь из друзей, было максимальным. Помогите ему определить даты приезда для каждого из друзей так, чтобы они не пересекались (допустима ситуация, что в один день один из друзей приезжает, а другой — уезжает) и суммарное время, когда у Васи в гостях есть кто-то из друзей, было максимальным.

Формат ввода

В первой строке записаны целое число N (1 ≤ N ≤ 100000) - количество друзей Васи.
В следующих N строках записано по два целых числа A_i и B_i (оба числа от 1 до 10^9) — возможное время приезда i-го друга.

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

Выведите N пар чисел L_i и R_i - номера дней, в которые приедет и уедет i-й друг соответственно (A_i ≤ L_i ≤ R_i ≤ B_i). Если i-го друга приглашать не нужно, выведите пару чисел -1 -1. Если правильных ответов несколько - выведите любой из них.

Пример

Ввод Вывод
3
1 2
2 4
3 5
1 2
3 4
5 5
3
2 3
1 4
3 5
-1 -1
1 4
5 5
C. Носки

[Источник] [Решение]

Имеется стол длины L. На столе разложено N носков так, что никакой носок не вылезает за границы стола. Далее имеется умный мальчик Васька, который хочет замерить толщину покрытия стола носками в M точках.

Формат ввода

Во входном файле даны сначала L, N, M (1 ≤ L ≤ 10000, 1 ≤ N ≤ 10000, 1 ≤ M ≤ 100000).
Далее идут N пар чисел l ≤ r от 1 до L – левые и правые концы носков.
Затем идут M чисел от 1 до L интересующие Васька точки.
Все числа целые.

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

Выведите M чисел – толщину носкового покрытия в каждой точке.

Пример

Ввод Вывод
22 18 8
6 11
10 15
3 18
1 19
10 17
1 10
6 16
20 21
1 1
12 21
5 9
1 10
5 10
6 11
5 6
7 11
1 19
13 15
5
22
19
3
8
16
16
21
8
0
3
5
11
6
6
2
D. Размер поддеревьев

[Источник] [Решение]

Дано неориентированное дерево, подвешенное за вершину 1. Для каждой вершины подсчитайте, сколько вершин содержится в поддереве, подвешенном за данную вершину.

Формат ввода

В первой строке вводится число V — количество вершин (3 ≤ V ≤ 100000)
В следующих V-1 строках записано по два числа: номера соединенных ребром вершин

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

Выведите V чисел — размеры поддеревьев для каждой из вершин

Пример

Ввод Вывод
4
1 2
1 3
1 4
4 1 1 1
7
1 2
1 3
1 4
5 1
5 6
5 7
7 1 1 1 3 1 1
E. Путь к файлу

[Источник] [Решение]

В операционной системе Xunil информация обо всех файлах и директориях хранится в специальном файле в следующем формате:

emoh
 vonavi
  a.doc
  b.doc
 vortep
  .bashrc
 vorodis
  onrop
   1.avi
   2.avi
rav
 bil

Имена файлов, и только они, содержат точку.
Требуется по данному имени файла найти путь к нему. Если таких файлов несколько, вывести путь к файлу, который записан выше.

Формат ввода

В первой строке вводится имя искомого файла. Во второй строке вводится общее количество файлов и директорий. В остальных строках вводится информация о файлах и директориях в указанном выше формате (директория или файл, находящиеся внутри другой директории, отделяются одним дополнительным пробелом в начале строки). Количество строк в файле и количество символов в каждой строке не превосходит 100.

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

Выведите путь к файлу в формате /директория/директория/…/файл
Гарантируется, что такой файл есть.
Гарантируется, что длина строки ответа не превосходит 255.

Пример

Ввод Вывод
1.avi
12
emoh
 vonavi
  a.doc
  b.doc
 vortep
  .bashrc
 vorodis
  onrop
   1.avi
   2.avi
rav
 bil
/emoh/vorodis/onrop/1.avi

Открытый лекторий: Набор 5

A. Быки и коровы

[Источник] [Решение]

Вася и Петя играют в игру «Быки и коровы».
Вася загадал число состоящее из N цифр, а Петя пытается его отгадать. Петя называет число из N цифр, а Вася отвечает, сколько в нем «быков» и «коров».
Количество «быков» вычисляется как количество цифр, стоящих на своем месте.
Количество «коров» вычисляется как количество цифр, которые есть и загаданном Васей числе и в названном Петей, но стоят на разных местах. То есть эти цифры могут быть переставлены таким образом, чтобы стать «Быками».
По загаданному Васей и названному Петей числам определите количество «быков» и «коров».

Формат ввода

Загаданное Васей и Петей числа положительные и вводятся по одному в строке. Количество цифр в числах не превосходит 1000. Числа не имеют ведущих нулей.

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

В первой строке выведите количество «быков», а во второй — «коров».

Пример

Ввод Вывод
1370
7311
1
2

Примечания

В числах 1370 и 7311 есть один «бык» (цифра 3), а также две «коровы» — одна из цифр 1 и цифра 7.

B. Наибольшая подстрока

[Источник] [Решение]

Дана строка s и число k.
В строке s требуется найти подстроку максимальной длины, в которой все различные символы встречаются не менее k раз.

Формат ввода

Первая строка содержит через пробел два целых числа n и k (1 ≤ n, k ≤ 2 * 10^5) — длину строки s и минимальное количество каждого из символов в искомой подстроке.
Вторая строка содержит строку s (|s| = n), состоящую из строчных латинских букв.

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

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

Пример

Ввод Вывод
5 3
aaabb
3
6 2
ababbc
5
C. Горы

[Источник] [Решение]

Недавно Глеб катался в горах. Как известно, горный хребет - такой набор гор с высотами h1…hn, что в нем больше 3 гор и существует такая основная гора с индексом i, что 1 < i < n и h_1 < h_2 < ⋯ < h_i > h_i+1 > ⋯ > h_n. Глеб помнит высоты всех гор, более того он даже помнит, что это был горный хребет, вам требуется вывести индекс любой основной горы.

Формат ввода

В первой строчке дается одно число n - количество гор. Затем в следующей строчке дается n чисел: высоты гор h_i. 3 ≤ n ≤ 10_4, 1 ≤ h_I ≤ 10^9.

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

Вам требуется вывести одно число - индекс любой основной горы.

Пример

Ввод Вывод
3
1 2 1
2
4
1 2 3 1
3
D. Удали строку

[Источник] [Решение]

Дана изначальная строка s. За одну операцию можно:

  • Взять непустой префикс строки состоящий из одинаковых букв.
  • Взять непустой суффикс строки состоящий из одинаковых букв.
  • И префикс, и суффикс должны состоять из одних и тех же букв.
  • Префикс и суффикс не должны пересекаться по символам.
  • Префикс и суффикс не обязательно равной длины.
  • Удалить полученные префикс и суффикс из строки.

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

Формат ввода

В единственной строке вводится изначальная строка s (1 ≤ ∣s∣ ≤ 10^5). Строка состоит из строчных букв латинского алфавита.

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

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

Пример

Ввод Вывод
abba 0
aboba 1
zzzaabxxxcazz 5

Примечания

В первом примере мы сначала выбираем префикс и суффикс "a" и удаляем их, получив строку "bb". Затем выбираем префикс и суффикс "b" и также удаляем их, удалив всю строку.
Во втором примере мы выбираем такие же суффиксы и префиксы: "aboba"→ "bob"→ "o". Можно показать, что единственный символ "o"никак нельзя удалить.
В третьем примере в качестве первой операции можно выбрать например префикс "zz" и суффикс "z".

E. PitCraft

[Источник] [Решение]

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

Формат ввода

В первой строке записано натуральное число N (1 ≤ N ≤ 100000) — количество столбцов, задающих ландшафт острова.
Во второй строке записано N натуральных чисел H_i (1 ≤ H_i ≤ 10^9) — высоты столбцов.

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

Выведите одно число — количество блоков занятых водой.

Пример

Ввод Вывод
11
2 5 2 3 6 9 3 1 3 4 6
18

Примечания

Пример соответствует рисунку. Черным цветом обозначен камень, серым — вода.

Intern week offer 2023 — бэкенд

A. USB-порты

[Источник] [Решение]

Вася подсчитал, что у него есть m гаджетов, которые нужно подключить к USB и всего n USB-портов на компьютере. В ближайшем интернет-магазине продаются разветвители с одного USB на два за c2 рублей и USB-хабы с одного USB на 5 по c5 рублей.
Разветвители и хабы можно подключать друг к другу и к USB-портам компьютера. Определите, какое минимальное количество рублей нужно потратить Васе, чтобы подключить все USB устройства. При этом можно обеспечить возможность подключить и больше m гаджетов, главное минимизировать цену.

Формат ввода

В первой строке входных данных записано число n (1 ≤ n ≤ 10^15) — количество USB-портов у компьютера. Во второй строке записано число m (1 ≤ m ≤ 10^15) — количество USB-гаджетов.
В следующих двух строках записаны целые числа c2 и c5 (1 ≤ c2, c5 ≤ 1000)

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

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

Пример

Ввод Вывод
1
3
1
10
2
2
4
9
10
10
3
8
9
10
19
B. Ровный забор

[Источник] [Решение]

Вася разобрал на даче старый сарай на n досок одинаковой ширины и толщины, но разной длины. Он решил построить из них забор. Высота забора не имеет для Васи особого значения, главное чтобы он был как можно более ровным. Неровность забора определяется как разница высот между самой короткой и самой длинной доской, использованной для постройки забора. После тщательного измерения оказалось, что k из n досок лишние и их можно не использовать для строительства забора.
Определите минимальную неровность забора, который можно построить из n−k досок.

Формат ввода

В первой строке входных данных записаны два числа n и k (0 ≤ k < n ≤ 200000) — количество досок от разбора сарая и количество лишних досок.
Во второй строке записаны n целых чисел l_i (1 ≤ l_i ≤ 10^9) — длины досок.

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

Выведите единственное целое число — минимальную неровность забора.

Пример

Ввод Вывод
2 0
15 19
4
7 2
1 11 6 41 15 13 14
9

Примечания

В первом примере нет лишних досок, поэтому неровность равна 19−15=4.
Во втором примере можно не использовать первую и четвертую доску для строительства забора.

C. Наследование репозиториев

[Источник] [Решение]

В системе контроля версий SEHR GUT можно наследовать репозиторий и вносить изменения кода в какую либо версию кода. При этом изменение, внесенное в версию кода, автоматически вносится во все репозитории, из которых был наследован код.
Исходно в системе есть только репозиторий 0. Если от него были пронаследованы репозитории 1 и 2, а от репозитория 1 был наследован репозиторий 3 и изменения были внесены в репозиторий 3, то они также внесутся в репозитории 1 и 0 (но не в репозиторий 2).
Вася хочет внести изменение в один репозиторий таким образом, чтобы они оказались в как можно большем количестве репозиториев.

Формат ввода

Во входном файле записано число N — общее количество наследованных репозиториев (1 ≤ N ≤ 100000). Затем следует описание наследования репозиториев: в i-ой строке записано число R_i — номер репозитория, наследником которого является i-ый репозиторий (0 ≤ R_i < i). Начальный репозиторий имеет номер 0.

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

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

Пример

Ввод Вывод
3
0
0
1
3
8
0
1
2
0
4
5
6
4
7

Примечания

Первый пример соответствует ситуации, описанной в условии. Репозитории номер 1 и 2 пронаследованы от репозитория с номером 0. Репозиторий номер 3 пронаследован от репозитория номер 1. Если внести изменение в репозиторий номер 3, то это изменение окажется в репозиториях с номерами 3, 1 и 0.

D. Раскопки и плитка

[Источник] [Решение]

В городе М есть два любимых занятия: укладывать плитку и проводить непонятные раскопки тротуара. До начала очередного сезона ремонтов на всех тротуарах была уложена плитка. После проведения раскопок тротуар непригоден для использования, пока на нем не уложат плитку. Всего в городе М k тротуаров.
От каждого тротуара без плитки жители города М ежедневно получают одну единицу печали. Если тротуар был раскопан в день a, а плитка на нём была уложена в день b, то жители города получат b−a единиц печали. Плитку можно уложить и в день раскопок, тогда жители получат 0 единиц печали. Тротуар, на котором проводились раскопки может быть снова раскопан и, если на нем была плитка, то она будет сломана.
Все раскопки и укладки плитки должны завершиться до выборов мэра города М, при этом на всех раскопанных тротуарах перед выборами должна быть уложена плитка. Всего работ по раскопкам тротуаров планируется n.
Руководителю компании-подрядчика по укладке плитки попал в руке план раскопок тротуаров с указанием номера тротуара и номера дня, когда тротуар будет раскопан. К сожалению, в бюджете выделены средства только для m укладок плитки на тротуарах. Зато в компании достаточно трудолюбивых работников чтобы уложить любое количество плитки в любой из дней.
Определите, какое наименьшее суммарное количество единиц печали получат жители города М до выборов мэра.

Формат ввода

В первой строке вводятся числа k, n и m (1 ≤ k ≤ 1000, 1 ≤ n, m ≤ 100000) — количество тротуаров, количество раскопок и количество укладок плитки, на которые выделены средства в бюджете.
В следующих n строках заданы пары чисел d_i, w_i (1 ≤ d_i ≤ 10^9, 1 ≤ w_i ≤ K) — день, в который будут проведены раскопки и номер тротуара, на которых они будут проводиться. Эти пары заданы в порядке неубывания d_i.

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

Выведите одно число — минимальное суммарное количество единиц печали. Если до выборов останутся раскопанные тротуары — выведите −1, как признак бесконечной печали жителей.

Пример

Ввод Вывод
5 4 3
1 2
2 3
2 1
6 2
5
2 4 2
1 1
1 2
3 1
4 2
5

Примечания

В первом примере на тротуарах 1 и 3 нужно уложить плитку в день раскопок, а тротуар 2 ремонтируется на шестой день, сразу после проведения раскопок.

E. Поступление с приоритетами

[Источник] [Решение]

При поступлении в университет абитуриенты указывают список приоритетов образовательных программ, на которые они хотели бы попасть. Все абитуриенты университета были ранжированы и выстроены по рейтингу (рейтинг некоторых абитуриентов может совпадать). На каждой образовательной программе есть контрольные цифры приёма — сколько абитуриентов может быть зачислено на это программу.
Вам необходимо справедливо распределить абитуриентов по программам. Для каждого абитуриента должно выполняться следующее: все места на более желаемых им программах, чем та, на которую он поступил (или на всех программах из списка абитуриента, если он не поступил никуда), заняты людьми с рейтингом выше чем у этого абитуриента.

Формат ввода

В первой строке задается два числа: n и k (1 ≤ n, k ≤ 100000) — количество абитуриентов и образовательных программ соответственно.
В следующей строке задается k чисел p_i (1 ≤ p_i ≤ 100000), где p_i — количество мест на программе номер i.
В следующих n строках записаны приоритеты для каждого абитуриента. Описание списка приоритетов состоит из числа r (1 ≤ r ≤ n) — позиции абитуриента в общем рейтинге, числа s (1 ≤ s ≤ N) — количества образовательных программ, на которые хочет поступить абитуриент, и s чисел от 1 до k — номера желаемых для поступления образовательных программ в порядке убывания приоритета. Номера образовательных программ в списке различны. Сумма s для всех абитуриентов не превосходит 10^6.

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

Для каждого из n абитуриентов выведите номер образовательной программы, на которую он поступит. Если абитуриент не поступит никуда, выведите -1. Если правильных ответов несколько — выведите любой из них.

Пример

Ввод Вывод
4 2
1 5
3 1 1
1 1 2
2 2 1 2
3 2 1 2
-1 2 1 2

About

Решения задач из различных тренировок по алгоритмам

Topics

Resources

License

Stars

Watchers

Forks

Languages