Задачи с отбора на стажировку в Яндекс (разбор контеста)

YOUTUBE · 28.11.2025 06:28

Ключевые темы и таймкоды

Введение

0:00
  • Разбор задач с контеста на стажировку в Яндекс.
  • Призыв подписаться на телеграм-канал для получения дополнительных материалов.

Задача 1 — Даты

0:21
  • Даны две даты в формате год, месяц, день, часы, минуты, секунды.
  • Необходимо определить количество целых дней и секунд между датами.
  • Перевод дат в секунды с помощью таблиц в примечании.
  • Нахождение разницы в секундах между датами.

Перевод секунд в дни

1:05
  • Деление разницы секунд на количество секунд в одном дне.
  • Вычисление остатка для определения секунд в неполном дне.

Задача 2 — Карточная игра

1:36
  • Два игрока играют в карточную игру, где карты обозначены целыми числами.
  • Алгоритм определения разнообразия коллекций карт.
  • Примеры изменения разнообразия после добавления или удаления карт.

Реализация алгоритма

3:24
  • Использование словарей для подсчёта количества карт у каждого игрока.
  • Расчёт разнообразия как суммы разностей по всем картам.
  • Обновление разнообразия после каждого запроса.

Задача 3 — База данных

5:56
  • Применение запросов к таблице базы данных.
  • Запросы выбирают строки, где значение колонки строго больше или меньше заданного значения.
  • Пример работы запросов на таблице с колонками «а» и «б».

Решение задачи 3

8:23
  • Установка начальных ограничений для каждой колонки.
  • Обновление границ ограничений на основе запросов.
  • Подсчёт суммы значений оставшихся строк после применения всех запросов.

Изменение границ и проверка строк

9:15
  • Изменение нижней границы для столбца B: 1 > -10^9 - 1, значение меняется на 1.
  • Изменение верхней границы для столбца B: 3 < текущая верхняя граница, значение заменяется на 3.
  • Создание массива для каждой строки: изначально все строки хорошие, отмечены единицами.
  • Пометка строк нулями, если хотя бы одно число не удовлетворяет условиям.

Пример проверки строк

10:33
  • Проверка первой строки: значение 1 удовлетворяет условиям, строка остаётся хорошей.
  • Проверка второй строки: значение 2 удовлетворяет условиям, строка остаётся хорошей.
  • Проверка столбца B: значение 1 не удовлетворяет диапазону 1–3, строка помечается нулём.

Решение задачи с языковым барьером

11:45
  • Описание древовидной структуры организации с сотрудниками, говорящими на языках A и B.
  • Генеральный директор знает оба языка.
  • Задача: для каждого сотрудника посчитать языковой барьер — расстояние до первого человека в иерархии, который знает язык сотрудника.

Использование стеков для решения задачи

13:10
  • Использование двух стеков: один для сотрудников, знающих язык A, другой — для знающих язык B.
  • Начало с генерального директора, который знает оба языка.
  • Расчёт языкового барьера для каждого сотрудника путём сравнения текущего времени с временем на стеке.

Пример расчёта языкового барьера

14:51
  • Пример расчёта для сотрудника 1: языковой барьер равен 0, так как непосредственный начальник знает язык сотрудника.
  • Пример расчёта для сотрудника 2: языковой барьер равен 1, так как начальник не знает языка, но знает генеральный директор.
  • Пример расчёта для сотрудника 3: языковой барьер равен 1, так как нужно перескочить через одного сотрудника.

Обработка закрывающихся вершин

15:59
  • Удаление вершин со стека при выходе из них.
  • Уменьшение текущего времени при выходе из вершины.
  • Пример обработки закрывающейся вершины: удаление тройки со стека и уменьшение текущего времени.

Задача о близости массивов

17:44
  • Определение близости двух целочисленных массивов как длины их наибольшего совпадающего префикса.
  • Задача: для каждой пары массивов посчитать близость и вычислить сумму таких близостей.
  • Ограничения: до 10^5, простое решение работает за O(n^3).

Разделение массивов на классы

18:30
  • Разделение массивов на классы по числу, которое встречается в массиве.
  • Создание словаря для хранения номера массива и индекса текущего рассматриваемого элемента.
  • Распределение пар массивов на хэш-таблицы или словари для ускорения обработки.

Сравнение массивов по первой цифре

19:16
  • Сравниваем массивы по первой цифре и вносим их в разные списки.
  • Получаем пары: 00, 10, 20.
  • Разделяем массивы по словарям, используя ключ для идентификации.
  • В словарь по ключу «единица» добавляем пары: 01, 11, 21.

Подсчёт пар и добавление к ответу

20:07
  • На каждой итерации подсчитываем количество элементов по каждому ключу.
  • Если элементов три, можем составить три пары.
  • Добавляем три к ответу.

Рекурсивное сравнение по второму элементу

20:35
  • Передаём массив по ключу функции для повторного сравнения.
  • Получаем пары: 02, 12, 22.
  • В словарь по ключу «два» попадают массивы 02 и 22.
  • В словарь по ключу «три» попадает массив 12.

Подсчёт пар для второго элемента

21:15
  • Считаем количество пар для каждого ключа: два элемента — одна пара, один элемент — ноль пар.
  • Добавляем единицу к ответу.

Завершение рекурсии и подведение итогов

22:09
  • Запускаем функцию от набора 0222.
  • Удаляем несуществующий элемент из рассмотрения.
  • Остаётся ключ «три» с парой 23.
  • Подсчитываем пары для третьего ключа, получаем ноль пар.
  • Итоговый ответ равен четырём.