Командная олимпиада школьников Санкт- Петербурга по информатике и программированию. Разбор задач

Содержание

Слайд 2

Задача A Бактерии

Задача A
Бактерии

Слайд 3

Автор задачи – Михаил Дворкин Условие – Михаил Дворкин Подготовка тестов

Автор задачи – Михаил Дворкин
Условие – Михаил Дворкин
Подготовка тестов – Сергей

Мельников
Разбор – Антон Ахи
Слайд 4

Постановка задачи Дано целое число n За один шаг можно: Разделить

Постановка задачи

Дано целое число n
За один шаг можно:
Разделить n на любой

его простой делитель
Возвести число n в квадрат
Требуется за минимальное число шагов получить число m
Слайд 5

Идея решения Определить, возможно ли получить m Разложить m на простые

Идея решения

Определить, возможно ли получить m
Разложить m на простые делители
Если хотя

бы один из них не является делителем n, то ответ «Impossible»
Слайд 6

Нахождение решения Рассмотреть задачу с конца ― получить из m число

Нахождение решения

Рассмотреть задачу с конца ― получить из m число n,

если разрешены операции:
Извлечь корень
Домножить на произвольное простое число
Слайд 7

Решение Разложить оба числа на простые множители Пока существует простой делитель,

Решение

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

в m в большей степени, чем в n, доводим каждый простой делитель m до четной степени и извлекаем корень
Домножаем на оставшиеся простые
Слайд 8

Почему это работает? Единственный способ уменьшить показатель простого делителя ― извлечение

Почему это работает?

Единственный способ уменьшить показатель простого делителя ― извлечение корня,

которое возможно лишь при условии четности всех степеней
Перед любым извлечением корня невыгодно увеличивать показатель более чем на один
Слайд 9

Задача B Шахматная головоломка

Задача B
Шахматная
головоломка

Слайд 10

Автор задачи – Виталий Аксенов Условие – Сергей Поромов Подготовка тестов

Автор задачи – Виталий Аксенов
Условие – Сергей Поромов
Подготовка тестов – Владимир

Ульянцев
Разбор – Антон Ахи
Слайд 11

Условие задачи Дано расположение коня на доске Требуется поставить ладью и

Условие задачи

Дано расположение коня на доске
Требуется поставить ладью и слона на

доску, чтобы они били коня, но не били друг друга
Слайд 12

Как решать? Если слон или ладья бьют коня, то конь их

Как решать?

Если слон или ладья бьют коня, то конь их не

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

Интересные клетки Ладья бьет все поля в том же столбце или

Интересные клетки

Ладья бьет все поля в том же столбце или строке
Слон

бьет все поля с такой же разницей номеров строки и столбца
Слайд 14

Задача C Шоколад

Задача C
Шоколад

Слайд 15

Автор задачи – Виталий Аксенов Условие – Антон Ахи Подготовка тестов

Автор задачи – Виталий Аксенов
Условие – Антон Ахи
Подготовка тестов – Нияз

Нигматуллин
Разбор – Сергей Поромов
Слайд 16

О чем задача?

О чем задача?

Слайд 17

Как решать? Перебрать всевозможные вертикальные и горизонтальные разрезы Проверить, можно ли

Как решать?

Перебрать всевозможные вертикальные и горизонтальные разрезы
Проверить, можно ли хоть один

из них провести: с разных сторон от разреза должны быть различные дольки, то есть различные числа
Слайд 18

Задача D Луна

Задача D
Луна

Слайд 19

Автор задачи – Юрий Петров Условие – Юрий Петров Подготовка тестов

Автор задачи – Юрий Петров
Условие – Юрий Петров
Подготовка тестов – Владимир

Ульянцев
Разбор – Сергей Поромов
Слайд 20

О чем задача? Необходимо найти луну на фотографии

О чем задача?

Необходимо найти луну на фотографии

Слайд 21

Как решать? Ограничения небольшие – можно и достаточно проверить всевозможные положения

Как решать?

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

размеры луны, выбрать наибольший размер
Не забыть, что луна должна быть целиком на фотографии
Слайд 22

Как проверить луну? Проверить, что все точки фотографии на расстоянии не

Как проверить луну?

Проверить, что все точки фотографии на расстоянии не более

радиуса от центра луны белые
Расстояние можно считать в целых числах:
Проверка работает за O(w·h).
Слайд 23

Задача E Ожерелье

Задача E
Ожерелье

Слайд 24

Автор задачи – Михаил Дворкин Условие – Сергей Поромов Подготовка тестов

Автор задачи – Михаил Дворкин
Условие – Сергей Поромов
Подготовка тестов – Нияз

Нигматуллин
Разбор – Сергей Мельников
Слайд 25

Как решать? Ожерелий из двух, трех, четырех и пяти жемчужин нет

Как решать?

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

возьмем ожерелье
1 1 0 1 0 … 0
Оно подходит, так как ось может проходить лишь через 1, но все такие оси не являются осями симметрии

- 1

Слайд 26

Альтернативное решение Генерируем случайное ожерелье Проверяем, есть ли ось симметрии

Альтернативное решение

Генерируем случайное ожерелье
Проверяем, есть ли ось симметрии

Слайд 27

Задача F Гонки

Задача F
Гонки

Слайд 28

Автор задачи – жюри олимпиады Условие – Антон Банных Подготовка тестов

Автор задачи – жюри олимпиады
Условие – Антон Банных
Подготовка тестов – Виталик

Аксенов
Разбор – Сергей Мельников
Слайд 29

За какое время проедет машина? Проедет x div (tv) целых сегментов

За какое время проедет машина?

Проедет x div (tv) целых сегментов длинной

tv, сделает между ними
x div (tv) – 1 зарядок батарей
Если x mod (tv) не 0, то надо проехать ещё, а для этого зарядить батарею
Таким образом, число зарядок: ceil(x / (tv)) – 1
Остальное время едет со скоростью v
Слайд 30

Как решать? Время для одной машины x / v + (ceil(x

Как решать?

Время для одной машины
x / v + (ceil(x / (tv))

– 1) * t
Сравнить время, за которое машины достигнут финиша
Слайд 31

Задача G Робот

Задача G
Робот

Слайд 32

Автор задачи – Михаил Дворкин Условие – Михаил Дворкин Подготовка тестов

Автор задачи – Михаил Дворкин
Условие – Михаил Дворкин
Подготовка тестов – Алексей

Цыпленков
Разбор – Алексей Цыпленков
Слайд 33

О чем задача Робот переместился из начала координат в точку A(x,

О чем задача

Робот переместился из начала координат в точку A(x, y),

при этом робот поворачивал только на 90 градусов направо или налево
Дана последовательность поворотов
Определить длины отрезков пути робота или некорректность пути
Слайд 34

Как решать? Длина каждого отрезка пути не меньше 1 и не

Как решать?

Длина каждого отрезка пути не меньше 1 и не больше

106
Для каждого направления (вверх, вниз, вправо, влево) найдем, есть ли отрезок пути робота, на котором он движется по этому направлению
Слайд 35

Пусть робот попадет в точку B, если всегда будет смещаться на

Пусть робот попадет в точку B, если всегда будет смещаться на

1
Чтобы попасть из В в А, нужно дополнительно сместиться на вектор А – В
Разложим вектор А – В по направлениям:
(все числа k1, k2, k3, k4 неотрицательны и не менее двух были равны нулю)
Слайд 36

Если все направления, коэффициенты при которых не равны 0, были найдены

Если все направления, коэффициенты при которых не равны 0, были найдены

в пути робота, то ответ существует и строится следующим образом:
Длины всех отрезков принять за 1
Для каждого направления с ненулеывм k взять один произвольный отрезок движения по этому направлению и увеличить его длину на k
Слайд 37

Если какого-то направления с ненулевым k нет в пути, то ответа не существует А B

Если какого-то направления с ненулевым k нет в пути, то ответа

не существует

А

B

Слайд 38

Задача H Санта

Задача H
Санта

Слайд 39

Автор задачи – Виталий Аксенов Условие – Сергей Мельников Подготовка тестов

Автор задачи – Виталий Аксенов
Условие – Сергей Мельников
Подготовка тестов – Алексей

Цыпленков
Разбор – Алексей Цыпленков
Слайд 40

О чем задача Даны два списка из K и М натуральных

О чем задача

Даны два списка из K и М натуральных чисел,

каждое не больше N. Найти все числа от 1 до N, которых нет в этом списке.
Каждое числе встречается в списках не более одного раза.
Слайд 41

Как решать? Так как каждое число встречается в списках не более

Как решать?

Так как каждое число встречается в списках не более одного

раза, то количество чисел, которых нет в списке, равно N – K
Так как N невелико, то за один линейный проход по спискам можно отметить все числа, которые в них есть
За линейный проход по массиву пометок вывести все числа, которых нет
Слайд 42

Задача I. Подстрока

Задача I.
Подстрока

Слайд 43

Автор задачи – Антон Банных Условие – Антон Банных Подготовка тестов

Автор задачи – Антон Банных
Условие – Антон Банных
Подготовка тестов – Антон

Банных
Разбор – Антон Банных
Слайд 44

Решение Ахо-Корасик Строка abc Запросы: 2 3 bc 2 3 abc

Решение

Ахо-Корасик
Строка abc
Запросы:
2 3 bc
2 3 abc

Слайд 45

Решение Для каждого префикса строки запишем, в какой вершине автомата мы

Решение

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

– 3
ab – 4
abc - 5
Слайд 46

Решение Рассмотрим дерево, образованное суффиксными ссылками

Решение

Рассмотрим дерево, образованное суффиксными ссылками

Слайд 47

Решение Для каждого запроса нужно определить, встречалась ли вершина из соответствующего поддерева в отрезке

Решение

Для каждого запроса нужно определить, встречалась ли вершина из соответствующего поддерева

в отрезке
Слайд 48

Решение Перенумеруем вершины в порядке выхода из обхода в глубину

Решение

Перенумеруем вершины в порядке выхода из обхода в глубину

Слайд 49

Вершины одного поддерева имеют последовательные номера Пусть пара (префикс, номер вершины)

Вершины одного поддерева имеют последовательные номера
Пусть пара (префикс, номер вершины) —

точка
Запрос — есть ли точка в прямоугольнике

Решение

Слайд 50

Решение Двумерное дерево отрезков — O(n log n) Одномерное дерево отрезков

Решение

Двумерное дерево отрезков — O(n log n)
Одномерное дерево отрезков на сумму
События:
Начало

прямоугольника
Конец прямоугольника
Точка
Слайд 51

Задача I. Подстрока

Задача I.
Подстрока

Слайд 52

Автор задачи – Антон Банных Условие – Антон Банных Подготовка тестов

Автор задачи – Антон Банных
Условие – Антон Банных
Подготовка тестов – Антон

Банных
Разбор – Антон Банных
Слайд 53

Как решать? Ахо-Корасик Суффиксный массив Суффиксное дерево Суффиксный автомат

Как решать?

Ахо-Корасик
Суффиксный массив
Суффиксное дерево
Суффиксный автомат

Слайд 54

Ахо-Корасик Строка abc Запросы: 2 3 bc 2 3 abc

Ахо-Корасик

Строка abc
Запросы:
2 3 bc
2 3 abc

Слайд 55

Решение Для каждого префикса строки запишем, в какой вершине автомата мы

Решение

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

– 3
ab – 4
abc – 5
Обозначим этот массив L
Слайд 56

Идея решения Рассмотрим дерево, образованное суффиксными ссылками

Идея решения

Рассмотрим дерево, образованное суффиксными ссылками

Слайд 57

Задача Запрос: l, r, длина строки len Строке соответствует вершина x

Задача

Запрос: l, r, длина строки len
Строке соответствует вершина x
Определить, встречалась ли

вершина из поддерева x в L[l + len – 1, r]
Слайд 58

Решение Перенумеруем вершины в порядке выхода из обхода в глубину

Решение

Перенумеруем вершины в порядке выхода из обхода в глубину

Слайд 59

Решение Вершины одного поддерева имеют последовательные номера Пусть пара (префикс, номер

Решение

Вершины одного поддерева имеют последовательные номера
Пусть пара (префикс, номер вершины) –

точка
Запрос – есть ли точка в прямоугольнике
Слайд 60

Решение

Решение

Слайд 61

Решение Двумерное дерево отрезков: O(n log2 n) Одномерное дерево отрезков на

Решение

Двумерное дерево отрезков: O(n log2 n)
Одномерное дерево отрезков на сумму
События:
Начало прямоугольника
Конец

прямоугольника
Точка
Слайд 62

Асимптотика Ахо-Корасик: O(n) Перенумерация вершин: O(n) Обработка запросов: O(n log n)

Асимптотика

Ахо-Корасик: O(n)
Перенумерация вершин: O(n)
Обработка запросов: O(n log n)

Слайд 63

Задача J Вода

Задача J
Вода

Слайд 64

Автор задачи – Виталий Аксенов Условие – Антон Ахи Подготовка тестов

Автор задачи – Виталий Аксенов
Условие – Антон Ахи
Подготовка тестов – Антон

Ахи
Разбор – Антон Банных
Слайд 65

Как решать? Поддерживаем текущий уровень воды Поддерживаем суммарную скорость вытекания воды Обрабатываем события

Как решать?

Поддерживаем текущий уровень воды
Поддерживаем суммарную скорость вытекания воды
Обрабатываем события

Слайд 66

События Уровень воды достиг очередного отверстия Запрос на уровень воды Появление новой течи Устранение течи

События

Уровень воды достиг очередного отверстия
Запрос на уровень воды
Появление новой течи
Устранение течи

Слайд 67

Решение Определяем ближайшее событие Вычисляем уровень воды к моменту наступления события Обрабатываем событие

Решение

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

Слайд 68

Реализация Выделим «интересные высоты» ─ те, которые встречаются в запросах Храним

Реализация

Выделим «интересные высоты» ─ те, которые встречаются в запросах
Храним скорость вытекания

воды через отверстия на высоте h
Событие ─ достижение «интересной высоты»
Слайд 69

Реализация Появление и починка течи ─ изменение соответствующего элемента массива и

Реализация

Появление и починка течи ─ изменение соответствующего элемента массива и суммарной

скорости вытекания
Запрос на определение уровня воды ─ вывод текущего уровня
Достижение «интересной высоты» ─ изменение суммарной скорости вытекания
Слайд 70

Асимптотика Выделение «интересных высот» сортировка: O(n log n) хеш-таблица: O(n) Обработка

Асимптотика

Выделение «интересных высот»
сортировка: O(n log n)
хеш-таблица: O(n)
Обработка событий: O(n)
Итого: O(n) или

O(n log n)