856.00K
Категория: ИнформатикаИнформатика

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

1.

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

2.

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

3.

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

4.

Постановка задачи
• Дано целое число n
• За один шаг можно:
– Разделить n на любой его простой делитель
– Возвести число n в квадрат
• Требуется за минимальное число шагов
получить число m
4

5.

Идея решения
• Определить, возможно ли получить m
– Разложить m на простые делители
– Если хотя бы один из них не является
делителем n, то ответ «Impossible»
5

6.

Нахождение решения
• Рассмотреть задачу с конца ― получить
из m число n, если разрешены
операции:
– Извлечь корень
– Домножить на произвольное простое число
6

7.

Решение
• Разложить оба числа на простые
множители
• Пока существует простой делитель,
который входит в m в большей степени,
чем в n, доводим каждый простой
делитель m до четной степени и
извлекаем корень
• Домножаем на оставшиеся простые
7

8.

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

9.

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

10.

Автор задачи – Виталий Аксенов
Условие – Сергей Поромов
Подготовка тестов – Владимир Ульянцев
Разбор – Антон Ахи
10

11.

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

12.

Как решать?
• Если слон или ладья бьют коня, то конь их не
бьет
• Позиций на доске мало
• Переберем все возможные позиции ладьи и
слона, из которых они бьют коня
• Проверим, что поставленные фигуры не бьют
друг друга
12

13.

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

14.

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

15.

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

16.

О чем задача?
16

17.

Как решать?
• Перебрать всевозможные
вертикальные и горизонтальные
разрезы
• Проверить, можно ли хоть один из них
провести: с разных сторон от разреза
должны быть различные дольки, то есть
различные числа
17

18.

Задача D
Луна
18

19.

Автор задачи – Юрий Петров
Условие – Юрий Петров
Подготовка тестов – Владимир
Ульянцев
Разбор – Сергей Поромов
19

20.

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

21.

Как решать?
• Ограничения небольшие – можно и
достаточно проверить всевозможные
положения и размеры луны, выбрать
наибольший размер
• Не забыть, что луна должна быть
целиком на фотографии
21

22.

Как проверить луну?
• Проверить, что все точки фотографии
на расстоянии не более радиуса от
центра луны белые
• Расстояние можно считать в целых
2
2
2
x

x

y

y

r
числах: 

0
0
• Проверка работает за O(w·h).
22

23.

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

24.

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

25.

Как решать?
• Ожерелий из двух, трех, четырех и пяти
жемчужин нет
• Для остальных возьмем
ожерелье
-1
11010…0
Оно подходит, так как ось может
проходить лишь через 1, но все такие
оси не являются осями симметрии
25

26.

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

27.

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

28.

Автор задачи – жюри олимпиады
Условие – Антон Банных
Подготовка тестов – Виталик Аксенов
Разбор – Сергей Мельников
28

29.

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

30.

Как решать?
• Время для одной машины
x / v + (ceil(x / (tv)) – 1) * t
• Сравнить время, за которое машины
достигнут финиша
30

31.

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

32.

Автор задачи – Михаил Дворкин
Условие – Михаил Дворкин
Подготовка тестов – Алексей Цыпленков
Разбор – Алексей Цыпленков
32

33.

О чем задача
• Робот переместился из начала
координат в точку A(x, y), при этом
робот поворачивал только на 90
градусов направо или налево
• Дана последовательность поворотов
• Определить длины отрезков пути
робота или некорректность пути
33

34.

Как решать?
• Длина каждого отрезка пути не меньше
1 и не больше 106
• Для каждого направления (вверх, вниз,
вправо, влево) найдем, есть ли отрезок
пути робота, на котором он движется по
этому направлению
34

35.

• Пусть робот попадет в точку B, если
всегда будет смещаться на 1
• Чтобы попасть из В в А, нужно
дополнительно сместиться на вектор А
–В
A − B = k 1  1,
0   k 2  0,
− 1, 0   k 4  0,− 1 
• Разложим
вектор
А1 –Вk 3 по
направлениям:
(все числа k1, k2, k3, k4 неотрицательны и
35

36.

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

37.

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

38.

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

39.

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

40.

О чем задача
• Даны два списка из K и М натуральных
чисел, каждое не больше N. Найти все
числа от 1 до N, которых нет в этом
списке.
• Каждое числе встречается в списках не
более одного раза.
40

41.

Как решать?
• Так как каждое число встречается в
списках не более одного раза, то
количество чисел, которых нет в списке,
равно N – K
• Так как N невелико, то за один линейный
проход по спискам можно отметить все
числа, которые в них есть
• За линейный проход по массиву пометок
вывести все числа, которых нет
41

42.

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

43.

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

44.

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

45.

Решение
• Для каждого префикса строки запишем,
в какой вершине автомата мы
оказались
• а–3
• ab – 4
• abc - 5
45

46.

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

47.

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

48.

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

49.

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

50.

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

51.

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

52.

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

53.

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

54.

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

55.

Решение
• Для каждого префикса строки запишем,
в какой вершине автомата мы
оказались
• а–3
• ab – 4
• abc – 5
• Обозначим этот массив L
55

56.

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

57.

Задача
• Запрос: l, r, длина строки len
• Строке соответствует вершина x
• Определить, встречалась ли вершина
из поддерева x в L[l + len – 1, r]
57

58.

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

59.

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

60.

Решение
60

61.

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

62.

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

63.

Задача J
Вода
63

64.

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

65.

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

66.

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

67.

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

68.

Реализация
• Выделим «интересные высоты» ─ те,
которые встречаются в запросах
• Храним скорость вытекания воды через
отверстия на высоте h
• Событие ─ достижение «интересной
высоты»
68

69.

Реализация
• Появление и починка течи ─ изменение
соответствующего элемента массива и
суммарной скорости вытекания
• Запрос на определение уровня воды ─
вывод текущего уровня
• Достижение «интересной высоты» ─
изменение суммарной скорости
вытекания
69

70.

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

71.

Спасибо за внимание!
Вопросы?
http://neerc.ifmo.ru/school
71
English     Русский Правила