SlideShare a Scribd company logo
1 of 67
Download to read offline
Всероссийская олимпиада школьников по
информатике
Региональный этап, II тур
Разбор задач
Андрианов И. А.
Стрекаловский О. А.
Вологодский государственный педагогический университет
Факультет прикладной математики,
компьютерных технологий и физики
Вологда
2014 г.
1/29 Всероссийская олимпиада школьников по информатике
Задача 5. Светофоры
«Светофоры»
Идея решения на 100 баллов
Целочисленное (кроме вывода ответа)
Сложность O(X/1000)
1 Заметим, что достаточно рассмотреть только два момента
старта — когда первый светофор меняет состояние с
красного на зеленый и с зеленого на красный.
2 Обозначим за t время движения, необходимое чтобы
проехать на второй светофор на зелёный.
2/29 Всероссийская олимпиада школьников по информатике
Задача 5. Светофоры
«Светофоры»
Идея решения на 100 баллов
Целочисленное (кроме вывода ответа)
Сложность O(X/1000)
1 Заметим, что достаточно рассмотреть только два момента
старта — когда первый светофор меняет состояние с
красного на зеленый и с зеленого на красный.
2 Обозначим за t время движения, необходимое чтобы
проехать на второй светофор на зелёный.
2/29 Всероссийская олимпиада школьников по информатике
Задача 5. Светофоры
Стартуем в момент смены зеленого на красный
Должно выполниться одно из следующих неравенств:
0 ≤ t ≤ a
a + b ≤ t ≤ 2 ∗ a + b
2 ∗ a + 2 ∗ b ≤ t ≤ 3 ∗ a + 2 ∗ b
и т.д.
То есть k ∗ (a + b) ≤ t ≤ k ∗ (a + b) + a, где k = 0, 1, 2, . . ..
3/29 Всероссийская олимпиада школьников по информатике
Задача 5. Светофоры
Стартуем в момент смены красного на зеленый
Должно выполниться одно из следующих неравенств:
b ≤ t ≤ b + a
2 ∗ b + a ≤ t ≤ 2 ∗ b + 2 ∗ a
и т.д.
То есть k ∗ (a + b) + b ≤ t ≤ (k + 1) ∗ (a + b), где k = 0, 1, . . ..
4/29 Всероссийская олимпиада школьников по информатике
Задача 5. Светофоры
1 Перебираем эти интервалы, увеличивая k.
2 Пусть t1 = k ∗ (a + b), а t2 = k ∗ (a + b) + a.
3 Зная диапазон времени [t1, t2], определяем диапазон
скорости [v1, v2], где v1 = x
t2
, v2 = x
t1
.
4 Если v1 > 1000, то это нам не подходит, так как наш кар
не может ехать так быстро.
5 Как только v1 станет меньше или равен 1000, то ответом
будет min(v2,1000).
6 Чтобы сравнивать не вещественные числа, а целые, можно
переписать неравенства, чтобы вместо делений были
умножения.
Например, вместо x/t2 <= 1000 будет x <= 1000 * t2.
5/29 Всероссийская олимпиада школьников по информатике
Задача 5. Светофоры
1 Перебираем эти интервалы, увеличивая k.
2 Пусть t1 = k ∗ (a + b), а t2 = k ∗ (a + b) + a.
3 Зная диапазон времени [t1, t2], определяем диапазон
скорости [v1, v2], где v1 = x
t2
, v2 = x
t1
.
4 Если v1 > 1000, то это нам не подходит, так как наш кар
не может ехать так быстро.
5 Как только v1 станет меньше или равен 1000, то ответом
будет min(v2,1000).
6 Чтобы сравнивать не вещественные числа, а целые, можно
переписать неравенства, чтобы вместо делений были
умножения.
Например, вместо x/t2 <= 1000 будет x <= 1000 * t2.
5/29 Всероссийская олимпиада школьников по информатике
Задача 5. Светофоры
1 Перебираем эти интервалы, увеличивая k.
2 Пусть t1 = k ∗ (a + b), а t2 = k ∗ (a + b) + a.
3 Зная диапазон времени [t1, t2], определяем диапазон
скорости [v1, v2], где v1 = x
t2
, v2 = x
t1
.
4 Если v1 > 1000, то это нам не подходит, так как наш кар
не может ехать так быстро.
5 Как только v1 станет меньше или равен 1000, то ответом
будет min(v2,1000).
6 Чтобы сравнивать не вещественные числа, а целые, можно
переписать неравенства, чтобы вместо делений были
умножения.
Например, вместо x/t2 <= 1000 будет x <= 1000 * t2.
5/29 Всероссийская олимпиада школьников по информатике
Задача 5. Светофоры
1 Перебираем эти интервалы, увеличивая k.
2 Пусть t1 = k ∗ (a + b), а t2 = k ∗ (a + b) + a.
3 Зная диапазон времени [t1, t2], определяем диапазон
скорости [v1, v2], где v1 = x
t2
, v2 = x
t1
.
4 Если v1 > 1000, то это нам не подходит, так как наш кар
не может ехать так быстро.
5 Как только v1 станет меньше или равен 1000, то ответом
будет min(v2,1000).
6 Чтобы сравнивать не вещественные числа, а целые, можно
переписать неравенства, чтобы вместо делений были
умножения.
Например, вместо x/t2 <= 1000 будет x <= 1000 * t2.
5/29 Всероссийская олимпиада школьников по информатике
Задача 5. Светофоры
1 Перебираем эти интервалы, увеличивая k.
2 Пусть t1 = k ∗ (a + b), а t2 = k ∗ (a + b) + a.
3 Зная диапазон времени [t1, t2], определяем диапазон
скорости [v1, v2], где v1 = x
t2
, v2 = x
t1
.
4 Если v1 > 1000, то это нам не подходит, так как наш кар
не может ехать так быстро.
5 Как только v1 станет меньше или равен 1000, то ответом
будет min(v2,1000).
6 Чтобы сравнивать не вещественные числа, а целые, можно
переписать неравенства, чтобы вместо делений были
умножения.
Например, вместо x/t2 <= 1000 будет x <= 1000 * t2.
5/29 Всероссийская олимпиада школьников по информатике
Задача 5. Светофоры
1 Перебираем эти интервалы, увеличивая k.
2 Пусть t1 = k ∗ (a + b), а t2 = k ∗ (a + b) + a.
3 Зная диапазон времени [t1, t2], определяем диапазон
скорости [v1, v2], где v1 = x
t2
, v2 = x
t1
.
4 Если v1 > 1000, то это нам не подходит, так как наш кар
не может ехать так быстро.
5 Как только v1 станет меньше или равен 1000, то ответом
будет min(v2,1000).
6 Чтобы сравнивать не вещественные числа, а целые, можно
переписать неравенства, чтобы вместо делений были
умножения.
Например, вместо x/t2 <= 1000 будет x <= 1000 * t2.
5/29 Всероссийская олимпиада школьников по информатике
Задача 5. Светофоры
«Светофоры»
Идея решения на 100 баллов
Вещественная арифметика
Сложность O(1)
1 Обозначим за interval интервал светофора (время
продолжения одного цикла «зелёный» – «красный»).
interval := a + b
2 Обозначим за t время движения между светофорами на
максимальной скорости.
t := dist / 1000. Деление вещественное.
3 Обозначим за intervalTime момент в интервале работы
второго светофора, когда мы подъезжаем на
максимальной скорости.
intervalTime := time % interval, где % — операция
взятия вещественного остатка от деления вещественного
числа на целое.
6/29 Всероссийская олимпиада школьников по информатике
Задача 5. Светофоры
«Светофоры»
Идея решения на 100 баллов
Вещественная арифметика
Сложность O(1)
1 Обозначим за interval интервал светофора (время
продолжения одного цикла «зелёный» – «красный»).
interval := a + b
2 Обозначим за t время движения между светофорами на
максимальной скорости.
t := dist / 1000. Деление вещественное.
3 Обозначим за intervalTime момент в интервале работы
второго светофора, когда мы подъезжаем на
максимальной скорости.
intervalTime := time % interval, где % — операция
взятия вещественного остатка от деления вещественного
числа на целое.
6/29 Всероссийская олимпиада школьников по информатике
Задача 5. Светофоры
«Светофоры»
Идея решения на 100 баллов
Вещественная арифметика
Сложность O(1)
1 Обозначим за interval интервал светофора (время
продолжения одного цикла «зелёный» – «красный»).
interval := a + b
2 Обозначим за t время движения между светофорами на
максимальной скорости.
t := dist / 1000. Деление вещественное.
3 Обозначим за intervalTime момент в интервале работы
второго светофора, когда мы подъезжаем на
максимальной скорости.
intervalTime := time % interval, где % — операция
взятия вещественного остатка от деления вещественного
числа на целое.
6/29 Всероссийская олимпиада школьников по информатике
Задача 5. Светофоры
Примеры реализация данной операции % на разных языках
Java
intervalTime = time % interval
Pascal
intervalTime :=
time - floor(time / (interval)) * (interval)
C++
intervalTime =
time - (int)(time / interval) * interval
7/29 Всероссийская олимпиада школьников по информатике
Задача 5. Светофоры
Примеры реализация данной операции % на разных языках
Java
intervalTime = time % interval
Pascal
intervalTime :=
time - floor(time / (interval)) * (interval)
C++
intervalTime =
time - (int)(time / interval) * interval
7/29 Всероссийская олимпиада школьников по информатике
Задача 5. Светофоры
Мы можем проехать на максимальной скорости через второй
светофор если выполняется хотя бы одно из условий:
№1. С первого светофора стартанём в момент перехода
«красный» – «зелёный» и приедем ко второму светофору,
когда на нём будет зелёный до перехода на красный.
Это можно записать следующим образом:
intervalTime <= a.
8/29 Всероссийская олимпиада школьников по информатике
Задача 5. Светофоры
№2. С первого светофора стартанём в момент перехода
«зелёный» – «красный» и успеем подъехать ко второму
светофору, когда на нём будет переход
«красный» – «зелёный» и до переключения на красный.
Это можно записать следующим образом:
intervalTime >= b.
9/29 Всероссийская олимпиада школьников по информатике
Задача 5. Светофоры
1 Если мы не успеваем проехать на максимальной скорости,
то надо «притормозить» на время, пока продолжает
гореть красный как в случае №2 выше:
time := time + b - intervalTime.
2 Найти скорость через вещественное деление пути на время:
speed := x / time.
10/29 Всероссийская олимпиада школьников по информатике
Задача 5. Светофоры
1 Если мы не успеваем проехать на максимальной скорости,
то надо «притормозить» на время, пока продолжает
гореть красный как в случае №2 выше:
time := time + b - intervalTime.
2 Найти скорость через вещественное деление пути на время:
speed := x / time.
10/29 Всероссийская олимпиада школьников по информатике
Задача 5. Светофоры
Вопросы по задаче?
11/29 Всероссийская олимпиада школьников по информатике
Задача 6. Кондиционеры
«Кондиционеры»
Идея решения на 100 баллов
Без сортировки
Сложность O(M ∗ 1000)
1 Прочитаем данные о классах в массив classes,
где classes[i] — необходимая мощность кондиционера в
i–м класе.
2 Создадим массив price, где price[i] — минимальная
стоимость кондиционера с мощностью ≥ i.
3 Прочитав из файла данные об очередном кондиционере с
мощностью b и стоимостью c, обновляем элементы
price[1] . . . price[b]:
i f p r i c e [ i ] > с then
p r i c e [ i ] := c
12/29 Всероссийская олимпиада школьников по информатике
Задача 6. Кондиционеры
«Кондиционеры»
Идея решения на 100 баллов
Без сортировки
Сложность O(M ∗ 1000)
1 Прочитаем данные о классах в массив classes,
где classes[i] — необходимая мощность кондиционера в
i–м класе.
2 Создадим массив price, где price[i] — минимальная
стоимость кондиционера с мощностью ≥ i.
3 Прочитав из файла данные об очередном кондиционере с
мощностью b и стоимостью c, обновляем элементы
price[1] . . . price[b]:
i f p r i c e [ i ] > с then
p r i c e [ i ] := c
12/29 Всероссийская олимпиада школьников по информатике
Задача 6. Кондиционеры
«Кондиционеры»
Идея решения на 100 баллов
Без сортировки
Сложность O(M ∗ 1000)
1 Прочитаем данные о классах в массив classes,
где classes[i] — необходимая мощность кондиционера в
i–м класе.
2 Создадим массив price, где price[i] — минимальная
стоимость кондиционера с мощностью ≥ i.
3 Прочитав из файла данные об очередном кондиционере с
мощностью b и стоимостью c, обновляем элементы
price[1] . . . price[b]:
i f p r i c e [ i ] > с then
p r i c e [ i ] := c
12/29 Всероссийская олимпиада школьников по информатике
Задача 6. Кондиционеры
1 Ответ для каждого класса i лежит в price[classes[i]].
2 Ответом на задачу будет сумма ответов для всех классов.
3 Количество действий порядка M ∗ 1000, так как мощность
не превышает 1000.
13/29 Всероссийская олимпиада школьников по информатике
Задача 6. Кондиционеры
1 Ответ для каждого класса i лежит в price[classes[i]].
2 Ответом на задачу будет сумма ответов для всех классов.
3 Количество действий порядка M ∗ 1000, так как мощность
не превышает 1000.
13/29 Всероссийская олимпиада школьников по информатике
Задача 6. Кондиционеры
1 Ответ для каждого класса i лежит в price[classes[i]].
2 Ответом на задачу будет сумма ответов для всех классов.
3 Количество действий порядка M ∗ 1000, так как мощность
не превышает 1000.
13/29 Всероссийская олимпиада школьников по информатике
Задача 6. Кондиционеры
«Кондиционеры»
Идея решения на 100 баллов
Сортировка + «жадный алгоритм».
Сложность O(M ∗ log(M) + N ∗ log(N))
1 Сортируем массив с кондиционерами (conds) по
возрастанию пары <стоимость, мощность>.
2 Сортируем массив классов (classes) по возрастанию
минимальной требуемой мощности кондиционеров.
14/29 Всероссийская олимпиада школьников по информатике
Задача 6. Кондиционеры
«Кондиционеры»
Идея решения на 100 баллов
Сортировка + «жадный алгоритм».
Сложность O(M ∗ log(M) + N ∗ log(N))
1 Сортируем массив с кондиционерами (conds) по
возрастанию пары <стоимость, мощность>.
2 Сортируем массив классов (classes) по возрастанию
минимальной требуемой мощности кондиционеров.
14/29 Всероссийская олимпиада школьников по информатике
Задача 6. Кондиционеры
1 Пусть lastSelectedIdx — индекс минимального
выбранного кондиционера.
Изначально равен 0 (или 1, если массив от 1).
2 Идём по отсортированному массиву классов.
3 Для каждого класса либо подходит кондиционер
conds[lastSelectedIdx], либо какой то «ближайший»
справа в массиве conds более мощный.
4 Если кондиционер подходит
(conds[lastSelectedIdx].power ≥ classes[i]), то добавляем
к ответу его стоимость и переходим к следующему классу.
5 Если слабоват, то
lastSelectedIdx := lastSelectedIdx + 1
и переходим к следующему кондиционеру, оставаясь в том
же классе.
6 По условию задачи всегда существует хотя бы один тип
кондиционеров, который можно поставить в любой класс.
15/29 Всероссийская олимпиада школьников по информатике
Задача 6. Кондиционеры
1 Пусть lastSelectedIdx — индекс минимального
выбранного кондиционера.
Изначально равен 0 (или 1, если массив от 1).
2 Идём по отсортированному массиву классов.
3 Для каждого класса либо подходит кондиционер
conds[lastSelectedIdx], либо какой то «ближайший»
справа в массиве conds более мощный.
4 Если кондиционер подходит
(conds[lastSelectedIdx].power ≥ classes[i]), то добавляем
к ответу его стоимость и переходим к следующему классу.
5 Если слабоват, то
lastSelectedIdx := lastSelectedIdx + 1
и переходим к следующему кондиционеру, оставаясь в том
же классе.
6 По условию задачи всегда существует хотя бы один тип
кондиционеров, который можно поставить в любой класс.
15/29 Всероссийская олимпиада школьников по информатике
Задача 6. Кондиционеры
1 Пусть lastSelectedIdx — индекс минимального
выбранного кондиционера.
Изначально равен 0 (или 1, если массив от 1).
2 Идём по отсортированному массиву классов.
3 Для каждого класса либо подходит кондиционер
conds[lastSelectedIdx], либо какой то «ближайший»
справа в массиве conds более мощный.
4 Если кондиционер подходит
(conds[lastSelectedIdx].power ≥ classes[i]), то добавляем
к ответу его стоимость и переходим к следующему классу.
5 Если слабоват, то
lastSelectedIdx := lastSelectedIdx + 1
и переходим к следующему кондиционеру, оставаясь в том
же классе.
6 По условию задачи всегда существует хотя бы один тип
кондиционеров, который можно поставить в любой класс.
15/29 Всероссийская олимпиада школьников по информатике
Задача 6. Кондиционеры
1 Пусть lastSelectedIdx — индекс минимального
выбранного кондиционера.
Изначально равен 0 (или 1, если массив от 1).
2 Идём по отсортированному массиву классов.
3 Для каждого класса либо подходит кондиционер
conds[lastSelectedIdx], либо какой то «ближайший»
справа в массиве conds более мощный.
4 Если кондиционер подходит
(conds[lastSelectedIdx].power ≥ classes[i]), то добавляем
к ответу его стоимость и переходим к следующему классу.
5 Если слабоват, то
lastSelectedIdx := lastSelectedIdx + 1
и переходим к следующему кондиционеру, оставаясь в том
же классе.
6 По условию задачи всегда существует хотя бы один тип
кондиционеров, который можно поставить в любой класс.
15/29 Всероссийская олимпиада школьников по информатике
Задача 6. Кондиционеры
Вопросы по задаче?
16/29 Всероссийская олимпиада школьников по информатике
Задача 7. Конфеты
«Конфеты»
Идея решения на 40 баллов
Сложность O(N2
)
1 Если a + b + c > N (не сможем положить ни одну коробку),
то подходит любой ящик с суммой размеров ≤ N.
2 Пусть x, y, z — количество коробок, которых влезает по
длине, ширине и высоте в коробку.
3 Перебор всевозможных значений x и y и вычислении z по
формуле
z =
n − ax − by
c
4 Проверяем, стало ли произведение x × y × z больше
текущего.
17/29 Всероссийская олимпиада школьников по информатике
Задача 7. Конфеты
«Конфеты»
Идея решения на 40 баллов
Сложность O(N2
)
1 Если a + b + c > N (не сможем положить ни одну коробку),
то подходит любой ящик с суммой размеров ≤ N.
2 Пусть x, y, z — количество коробок, которых влезает по
длине, ширине и высоте в коробку.
3 Перебор всевозможных значений x и y и вычислении z по
формуле
z =
n − ax − by
c
4 Проверяем, стало ли произведение x × y × z больше
текущего.
17/29 Всероссийская олимпиада школьников по информатике
Задача 7. Конфеты
«Конфеты»
Идея решения на 70 баллов
Динамическое программирование
Сложность O(N)
1 Пусть p, q, r — количество коробок, которое помещается в
ящик в длину, ширину и высоту.
2 Нам нужно максимизировать произведение p × q × r при
ограничении a × p + b × q + c × r ≤ N.
3 Создадим массив vars длины n, где каждый элемент
vars[i] содержит запись с полями p, q, r, такими, что
a × p + b × q + c × r = i и при этом p × q × r максимально.
18/29 Всероссийская олимпиада школьников по информатике
Задача 7. Конфеты
«Конфеты»
Идея решения на 70 баллов
Динамическое программирование
Сложность O(N)
1 Пусть p, q, r — количество коробок, которое помещается в
ящик в длину, ширину и высоту.
2 Нам нужно максимизировать произведение p × q × r при
ограничении a × p + b × q + c × r ≤ N.
3 Создадим массив vars длины n, где каждый элемент
vars[i] содержит запись с полями p, q, r, такими, что
a × p + b × q + c × r = i и при этом p × q × r максимально.
18/29 Всероссийская олимпиада школьников по информатике
Задача 7. Конфеты
Чтобы найти vars[i], рассмотрим элементы
vars[i − a], vars[i − b] и vars[i − c] и выберем максимальный.
Для vars[i − a] мы можем увеличить p на 1, тогда
a ∗ (vars[i − a].p + 1) + b ∗ vars[i − a].q + c ∗ vars[i − a].r
будет равно i.
Для vars[i − b] мы можем увеличить q на 1, тогда
a ∗ vars[i − a].p + b ∗ (vars[i − a].q + 1) + c ∗ vars[i − a].r
будет равно i.
Для vars[i − c] мы можем увеличить r на 1, тогда
a ∗ vars[i − a].p + b ∗ vars[i − a].q + c ∗ (vars[i − a].r + 1)
будет равно i.
Заполнив массив vars, находим в нём такой элемент k, для
которого p × q × r максимально.
19/29 Всероссийская олимпиада школьников по информатике
Задача 7. Конфеты
Чтобы найти vars[i], рассмотрим элементы
vars[i − a], vars[i − b] и vars[i − c] и выберем максимальный.
Для vars[i − a] мы можем увеличить p на 1, тогда
a ∗ (vars[i − a].p + 1) + b ∗ vars[i − a].q + c ∗ vars[i − a].r
будет равно i.
Для vars[i − b] мы можем увеличить q на 1, тогда
a ∗ vars[i − a].p + b ∗ (vars[i − a].q + 1) + c ∗ vars[i − a].r
будет равно i.
Для vars[i − c] мы можем увеличить r на 1, тогда
a ∗ vars[i − a].p + b ∗ vars[i − a].q + c ∗ (vars[i − a].r + 1)
будет равно i.
Заполнив массив vars, находим в нём такой элемент k, для
которого p × q × r максимально.
19/29 Всероссийская олимпиада школьников по информатике
Задача 7. Конфеты
Чтобы найти vars[i], рассмотрим элементы
vars[i − a], vars[i − b] и vars[i − c] и выберем максимальный.
Для vars[i − a] мы можем увеличить p на 1, тогда
a ∗ (vars[i − a].p + 1) + b ∗ vars[i − a].q + c ∗ vars[i − a].r
будет равно i.
Для vars[i − b] мы можем увеличить q на 1, тогда
a ∗ vars[i − a].p + b ∗ (vars[i − a].q + 1) + c ∗ vars[i − a].r
будет равно i.
Для vars[i − c] мы можем увеличить r на 1, тогда
a ∗ vars[i − a].p + b ∗ vars[i − a].q + c ∗ (vars[i − a].r + 1)
будет равно i.
Заполнив массив vars, находим в нём такой элемент k, для
которого p × q × r максимально.
19/29 Всероссийская олимпиада школьников по информатике
Задача 7. Конфеты
«Конфеты»
Идея решения на 100 баллов
Сложность O(
3
√
n2)
1 Полагаем, что a ≥ b ≥ c.
Если это не так, то отсортируем их по убыванию, но
запомним - кто был каким.
2 Берём x в n
3a − 3
√
n, n
3a + 3
√
n .
3 Берём y в n−ax
2b − 3
√
n, n−ax
2b + 3
√
n .
4 Получаем z = n−ax−by
c и проверяем, стало ли
произведение x × y × z больше текущего.
20/29 Всероссийская олимпиада школьников по информатике
Задача 7. Конфеты
«Конфеты»
Идея решения на 100 баллов
Сложность O(
3
√
n2)
1 Полагаем, что a ≥ b ≥ c.
Если это не так, то отсортируем их по убыванию, но
запомним - кто был каким.
2 Берём x в n
3a − 3
√
n, n
3a + 3
√
n .
3 Берём y в n−ax
2b − 3
√
n, n−ax
2b + 3
√
n .
4 Получаем z = n−ax−by
c и проверяем, стало ли
произведение x × y × z больше текущего.
20/29 Всероссийская олимпиада школьников по информатике
Задача 7. Конфеты
Вопросы по задаче?
21/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
«Волонтёры»
Формализация задачи
Члены научного комитета образуют дерево, члены
технического комитета — тоже дерево.
У этих деревьев общие листья — волонтеры.
Требуется сосчитать количество пар вершин (u, v), где
u — вершина из левого дерева, v — из правого, и между u
и v есть путь, идущий всегда слева направо.
22/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
«Волонтёры»
Формализация задачи
Члены научного комитета образуют дерево, члены
технического комитета — тоже дерево.
У этих деревьев общие листья — волонтеры.
Требуется сосчитать количество пар вершин (u, v), где
u — вершина из левого дерева, v — из правого, и между u
и v есть путь, идущий всегда слева направо.
22/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
«Волонтёры»
Идея решения на 50 баллов
Сложность O(M ∗ K + N + M + K)
1 Для каждой вершины каждого дерева найдём номера
листьев, которые ей соответствуют.
2 Любой вершине соответствуют последовательные номера
листьев без пропусков.
3 Диапазон листьев будем хранить в каждой вершине как
два числа v1 и v2 — начальный номер листа и конечный.
4 Перебираем все пары вершин (u, v) и определяем, имеют
ли отнесенные к ним отрезки общее пересечение.
23/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
«Волонтёры»
Идея решения на 50 баллов
Сложность O(M ∗ K + N + M + K)
1 Для каждой вершины каждого дерева найдём номера
листьев, которые ей соответствуют.
2 Любой вершине соответствуют последовательные номера
листьев без пропусков.
3 Диапазон листьев будем хранить в каждой вершине как
два числа v1 и v2 — начальный номер листа и конечный.
4 Перебираем все пары вершин (u, v) и определяем, имеют
ли отнесенные к ним отрезки общее пересечение.
23/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
«Волонтёры»
Идея решения на 50 баллов
Сложность O(M ∗ K + N + M + K)
1 Для каждой вершины каждого дерева найдём номера
листьев, которые ей соответствуют.
2 Любой вершине соответствуют последовательные номера
листьев без пропусков.
3 Диапазон листьев будем хранить в каждой вершине как
два числа v1 и v2 — начальный номер листа и конечный.
4 Перебираем все пары вершин (u, v) и определяем, имеют
ли отнесенные к ним отрезки общее пересечение.
23/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
«Волонтёры»
Идея решения на 50 баллов
Сложность O(M ∗ K + N + M + K)
1 Для каждой вершины каждого дерева найдём номера
листьев, которые ей соответствуют.
2 Любой вершине соответствуют последовательные номера
листьев без пропусков.
3 Диапазон листьев будем хранить в каждой вершине как
два числа v1 и v2 — начальный номер листа и конечный.
4 Перебираем все пары вершин (u, v) и определяем, имеют
ли отнесенные к ним отрезки общее пересечение.
23/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
Поиск v1 и v2 для вершин дерева
1 Найти этот номера очень легко с помощью поиска в
глубину.
2 Пусть мы рассматриваем вершину p.
3 Посетим рекурсивно всех её детей, в результате
вычислятся их диапазоны номеров листьев.
4 Возьмём среди этих номеров самый маленький и самый
большой — это и будет номера v1 и v2 для вершины p.
24/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
Поиск v1 и v2 для вершин дерева
1 Найти этот номера очень легко с помощью поиска в
глубину.
2 Пусть мы рассматриваем вершину p.
3 Посетим рекурсивно всех её детей, в результате
вычислятся их диапазоны номеров листьев.
4 Возьмём среди этих номеров самый маленький и самый
большой — это и будет номера v1 и v2 для вершины p.
24/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
Поиск v1 и v2 для вершин дерева
1 Найти этот номера очень легко с помощью поиска в
глубину.
2 Пусть мы рассматриваем вершину p.
3 Посетим рекурсивно всех её детей, в результате
вычислятся их диапазоны номеров листьев.
4 Возьмём среди этих номеров самый маленький и самый
большой — это и будет номера v1 и v2 для вершины p.
24/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
«Волонтёры»
Улучшение решения до 100 баллов
Сложность O((M + K) ∗ log(M + K) + N + M + K)
1 Полученные диапазоны номеров листьев в вершинах
можно рассматривать как отрезки на координатной
прямой.
2 Обозначим их в левом дереве синими, а в правом -
красными.
3 Нам нужно найти количество пар синих и красных
отрезков, которые пересекаются.
25/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
«Волонтёры»
Улучшение решения до 100 баллов
Сложность O((M + K) ∗ log(M + K) + N + M + K)
1 Полученные диапазоны номеров листьев в вершинах
можно рассматривать как отрезки на координатной
прямой.
2 Обозначим их в левом дереве синими, а в правом -
красными.
3 Нам нужно найти количество пар синих и красных
отрезков, которые пересекаются.
25/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
«Волонтёры»
Улучшение решения до 100 баллов
Сложность O((M + K) ∗ log(M + K) + N + M + K)
1 Полученные диапазоны номеров листьев в вершинах
можно рассматривать как отрезки на координатной
прямой.
2 Обозначим их в левом дереве синими, а в правом -
красными.
3 Нам нужно найти количество пар синих и красных
отрезков, которые пересекаются.
25/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
1 Возьмём координаты начал и концов всех отрезков и
занесём их в массив.
Каждый элемент массива будет хранить три поля:
координату
признак (начало или конец отрезка)
цвет (красный или синий)
2 Отсортируем массив:
1 Сортируем по возрастанию координаты
2 Для одинаковых координат сортируем по типу (сначала
открывающие, потом закрывающие)
3 Сортируем по цвету (сначала синие, потом красные)
3 Заведём две переменные:
red — количество открытых красных отрезков,
blue — количество открытых синих.
26/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
1 Возьмём координаты начал и концов всех отрезков и
занесём их в массив.
Каждый элемент массива будет хранить три поля:
координату
признак (начало или конец отрезка)
цвет (красный или синий)
2 Отсортируем массив:
1 Сортируем по возрастанию координаты
2 Для одинаковых координат сортируем по типу (сначала
открывающие, потом закрывающие)
3 Сортируем по цвету (сначала синие, потом красные)
3 Заведём две переменные:
red — количество открытых красных отрезков,
blue — количество открытых синих.
26/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
1 Возьмём координаты начал и концов всех отрезков и
занесём их в массив.
Каждый элемент массива будет хранить три поля:
координату
признак (начало или конец отрезка)
цвет (красный или синий)
2 Отсортируем массив:
1 Сортируем по возрастанию координаты
2 Для одинаковых координат сортируем по типу (сначала
открывающие, потом закрывающие)
3 Сортируем по цвету (сначала синие, потом красные)
3 Заведём две переменные:
red — количество открытых красных отрезков,
blue — количество открытых синих.
26/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
1 Обозначим за answer ответ в задаче.
2 Пройдёмся по массиву:
Встав на очередной элемент, рассмотрим возможные
случаи:
1 Если открывается синий отрезок:
blue := blue + 1
answer := answer + red (потому что этот отрезок
конфликтует со всеми открытыми на данный момент
красными отрезками).
2 Если открывается красный отрезок:
red := red + 1
answer := answer + blue
3 Если отрезок закрывается:
blue := blue - 1 либо
red := red - 1 соответственно.
27/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
1 Обозначим за answer ответ в задаче.
2 Пройдёмся по массиву:
Встав на очередной элемент, рассмотрим возможные
случаи:
1 Если открывается синий отрезок:
blue := blue + 1
answer := answer + red (потому что этот отрезок
конфликтует со всеми открытыми на данный момент
красными отрезками).
2 Если открывается красный отрезок:
red := red + 1
answer := answer + blue
3 Если отрезок закрывается:
blue := blue - 1 либо
red := red - 1 соответственно.
27/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
1 Обозначим за answer ответ в задаче.
2 Пройдёмся по массиву:
Встав на очередной элемент, рассмотрим возможные
случаи:
1 Если открывается синий отрезок:
blue := blue + 1
answer := answer + red (потому что этот отрезок
конфликтует со всеми открытыми на данный момент
красными отрезками).
2 Если открывается красный отрезок:
red := red + 1
answer := answer + blue
3 Если отрезок закрывается:
blue := blue - 1 либо
red := red - 1 соответственно.
27/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
1 Обозначим за answer ответ в задаче.
2 Пройдёмся по массиву:
Встав на очередной элемент, рассмотрим возможные
случаи:
1 Если открывается синий отрезок:
blue := blue + 1
answer := answer + red (потому что этот отрезок
конфликтует со всеми открытыми на данный момент
красными отрезками).
2 Если открывается красный отрезок:
red := red + 1
answer := answer + blue
3 Если отрезок закрывается:
blue := blue - 1 либо
red := red - 1 соответственно.
27/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
1 Обозначим за answer ответ в задаче.
2 Пройдёмся по массиву:
Встав на очередной элемент, рассмотрим возможные
случаи:
1 Если открывается синий отрезок:
blue := blue + 1
answer := answer + red (потому что этот отрезок
конфликтует со всеми открытыми на данный момент
красными отрезками).
2 Если открывается красный отрезок:
red := red + 1
answer := answer + blue
3 Если отрезок закрывается:
blue := blue - 1 либо
red := red - 1 соответственно.
27/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
1 Обозначим за answer ответ в задаче.
2 Пройдёмся по массиву:
Встав на очередной элемент, рассмотрим возможные
случаи:
1 Если открывается синий отрезок:
blue := blue + 1
answer := answer + red (потому что этот отрезок
конфликтует со всеми открытыми на данный момент
красными отрезками).
2 Если открывается красный отрезок:
red := red + 1
answer := answer + blue
3 Если отрезок закрывается:
blue := blue - 1 либо
red := red - 1 соответственно.
27/29 Всероссийская олимпиада школьников по информатике
Задача 8. Волонтёры
Вопросы по задаче?
28/29 Всероссийская олимпиада школьников по информатике
Заключение
Спасибо за внимание!
29/29 Всероссийская олимпиада школьников по информатике

More Related Content

Viewers also liked

Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Олег Стрекаловский
 
Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Олег Стрекаловский
 
Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Олег Стрекаловский
 

Viewers also liked (6)

Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...
 
Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...
 
Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...
 
Analysis day2
Analysis day2Analysis day2
Analysis day2
 
Analysis day1 - 2016
Analysis day1 - 2016Analysis day1 - 2016
Analysis day1 - 2016
 
Защита моей ВКР.
Защита моей ВКР.Защита моей ВКР.
Защита моей ВКР.
 

Similar to Разбор задач областного этапа всероссийской олимпиады школьников по информатике 2014г. II тур

3 зудина е., алгебра и начала анализа
3 зудина е., алгебра и начала анализа3 зудина е., алгебра и начала анализа
3 зудина е., алгебра и начала анализа
Eza2008
 
Алгебра и начала анализа (решение задач)
Алгебра и начала анализа (решение задач)Алгебра и начала анализа (решение задач)
Алгебра и начала анализа (решение задач)
Eza2008
 

Similar to Разбор задач областного этапа всероссийской олимпиады школьников по информатике 2014г. II тур (7)

Proizvodnaja
ProizvodnajaProizvodnaja
Proizvodnaja
 
7
77
7
 
3 зудина е., алгебра и начала анализа
3 зудина е., алгебра и начала анализа3 зудина е., алгебра и начала анализа
3 зудина е., алгебра и начала анализа
 
Алгебра и начала анализа (решение задач)
Алгебра и начала анализа (решение задач)Алгебра и начала анализа (решение задач)
Алгебра и начала анализа (решение задач)
 
Графический метод
Графический методГрафический метод
Графический метод
 
Подготавливающий материал к решению заданий в1, в5 и в12 на егэ
Подготавливающий материал к решению заданий в1, в5 и в12 на егэПодготавливающий материал к решению заданий в1, в5 и в12 на егэ
Подготавливающий материал к решению заданий в1, в5 и в12 на егэ
 
ОГЭ 2015 Модуль "Реальная математика" задание 20
ОГЭ 2015 Модуль "Реальная математика" задание 20ОГЭ 2015 Модуль "Реальная математика" задание 20
ОГЭ 2015 Модуль "Реальная математика" задание 20
 

Разбор задач областного этапа всероссийской олимпиады школьников по информатике 2014г. II тур

  • 1. Всероссийская олимпиада школьников по информатике Региональный этап, II тур Разбор задач Андрианов И. А. Стрекаловский О. А. Вологодский государственный педагогический университет Факультет прикладной математики, компьютерных технологий и физики Вологда 2014 г. 1/29 Всероссийская олимпиада школьников по информатике
  • 2. Задача 5. Светофоры «Светофоры» Идея решения на 100 баллов Целочисленное (кроме вывода ответа) Сложность O(X/1000) 1 Заметим, что достаточно рассмотреть только два момента старта — когда первый светофор меняет состояние с красного на зеленый и с зеленого на красный. 2 Обозначим за t время движения, необходимое чтобы проехать на второй светофор на зелёный. 2/29 Всероссийская олимпиада школьников по информатике
  • 3. Задача 5. Светофоры «Светофоры» Идея решения на 100 баллов Целочисленное (кроме вывода ответа) Сложность O(X/1000) 1 Заметим, что достаточно рассмотреть только два момента старта — когда первый светофор меняет состояние с красного на зеленый и с зеленого на красный. 2 Обозначим за t время движения, необходимое чтобы проехать на второй светофор на зелёный. 2/29 Всероссийская олимпиада школьников по информатике
  • 4. Задача 5. Светофоры Стартуем в момент смены зеленого на красный Должно выполниться одно из следующих неравенств: 0 ≤ t ≤ a a + b ≤ t ≤ 2 ∗ a + b 2 ∗ a + 2 ∗ b ≤ t ≤ 3 ∗ a + 2 ∗ b и т.д. То есть k ∗ (a + b) ≤ t ≤ k ∗ (a + b) + a, где k = 0, 1, 2, . . .. 3/29 Всероссийская олимпиада школьников по информатике
  • 5. Задача 5. Светофоры Стартуем в момент смены красного на зеленый Должно выполниться одно из следующих неравенств: b ≤ t ≤ b + a 2 ∗ b + a ≤ t ≤ 2 ∗ b + 2 ∗ a и т.д. То есть k ∗ (a + b) + b ≤ t ≤ (k + 1) ∗ (a + b), где k = 0, 1, . . .. 4/29 Всероссийская олимпиада школьников по информатике
  • 6. Задача 5. Светофоры 1 Перебираем эти интервалы, увеличивая k. 2 Пусть t1 = k ∗ (a + b), а t2 = k ∗ (a + b) + a. 3 Зная диапазон времени [t1, t2], определяем диапазон скорости [v1, v2], где v1 = x t2 , v2 = x t1 . 4 Если v1 > 1000, то это нам не подходит, так как наш кар не может ехать так быстро. 5 Как только v1 станет меньше или равен 1000, то ответом будет min(v2,1000). 6 Чтобы сравнивать не вещественные числа, а целые, можно переписать неравенства, чтобы вместо делений были умножения. Например, вместо x/t2 <= 1000 будет x <= 1000 * t2. 5/29 Всероссийская олимпиада школьников по информатике
  • 7. Задача 5. Светофоры 1 Перебираем эти интервалы, увеличивая k. 2 Пусть t1 = k ∗ (a + b), а t2 = k ∗ (a + b) + a. 3 Зная диапазон времени [t1, t2], определяем диапазон скорости [v1, v2], где v1 = x t2 , v2 = x t1 . 4 Если v1 > 1000, то это нам не подходит, так как наш кар не может ехать так быстро. 5 Как только v1 станет меньше или равен 1000, то ответом будет min(v2,1000). 6 Чтобы сравнивать не вещественные числа, а целые, можно переписать неравенства, чтобы вместо делений были умножения. Например, вместо x/t2 <= 1000 будет x <= 1000 * t2. 5/29 Всероссийская олимпиада школьников по информатике
  • 8. Задача 5. Светофоры 1 Перебираем эти интервалы, увеличивая k. 2 Пусть t1 = k ∗ (a + b), а t2 = k ∗ (a + b) + a. 3 Зная диапазон времени [t1, t2], определяем диапазон скорости [v1, v2], где v1 = x t2 , v2 = x t1 . 4 Если v1 > 1000, то это нам не подходит, так как наш кар не может ехать так быстро. 5 Как только v1 станет меньше или равен 1000, то ответом будет min(v2,1000). 6 Чтобы сравнивать не вещественные числа, а целые, можно переписать неравенства, чтобы вместо делений были умножения. Например, вместо x/t2 <= 1000 будет x <= 1000 * t2. 5/29 Всероссийская олимпиада школьников по информатике
  • 9. Задача 5. Светофоры 1 Перебираем эти интервалы, увеличивая k. 2 Пусть t1 = k ∗ (a + b), а t2 = k ∗ (a + b) + a. 3 Зная диапазон времени [t1, t2], определяем диапазон скорости [v1, v2], где v1 = x t2 , v2 = x t1 . 4 Если v1 > 1000, то это нам не подходит, так как наш кар не может ехать так быстро. 5 Как только v1 станет меньше или равен 1000, то ответом будет min(v2,1000). 6 Чтобы сравнивать не вещественные числа, а целые, можно переписать неравенства, чтобы вместо делений были умножения. Например, вместо x/t2 <= 1000 будет x <= 1000 * t2. 5/29 Всероссийская олимпиада школьников по информатике
  • 10. Задача 5. Светофоры 1 Перебираем эти интервалы, увеличивая k. 2 Пусть t1 = k ∗ (a + b), а t2 = k ∗ (a + b) + a. 3 Зная диапазон времени [t1, t2], определяем диапазон скорости [v1, v2], где v1 = x t2 , v2 = x t1 . 4 Если v1 > 1000, то это нам не подходит, так как наш кар не может ехать так быстро. 5 Как только v1 станет меньше или равен 1000, то ответом будет min(v2,1000). 6 Чтобы сравнивать не вещественные числа, а целые, можно переписать неравенства, чтобы вместо делений были умножения. Например, вместо x/t2 <= 1000 будет x <= 1000 * t2. 5/29 Всероссийская олимпиада школьников по информатике
  • 11. Задача 5. Светофоры 1 Перебираем эти интервалы, увеличивая k. 2 Пусть t1 = k ∗ (a + b), а t2 = k ∗ (a + b) + a. 3 Зная диапазон времени [t1, t2], определяем диапазон скорости [v1, v2], где v1 = x t2 , v2 = x t1 . 4 Если v1 > 1000, то это нам не подходит, так как наш кар не может ехать так быстро. 5 Как только v1 станет меньше или равен 1000, то ответом будет min(v2,1000). 6 Чтобы сравнивать не вещественные числа, а целые, можно переписать неравенства, чтобы вместо делений были умножения. Например, вместо x/t2 <= 1000 будет x <= 1000 * t2. 5/29 Всероссийская олимпиада школьников по информатике
  • 12. Задача 5. Светофоры «Светофоры» Идея решения на 100 баллов Вещественная арифметика Сложность O(1) 1 Обозначим за interval интервал светофора (время продолжения одного цикла «зелёный» – «красный»). interval := a + b 2 Обозначим за t время движения между светофорами на максимальной скорости. t := dist / 1000. Деление вещественное. 3 Обозначим за intervalTime момент в интервале работы второго светофора, когда мы подъезжаем на максимальной скорости. intervalTime := time % interval, где % — операция взятия вещественного остатка от деления вещественного числа на целое. 6/29 Всероссийская олимпиада школьников по информатике
  • 13. Задача 5. Светофоры «Светофоры» Идея решения на 100 баллов Вещественная арифметика Сложность O(1) 1 Обозначим за interval интервал светофора (время продолжения одного цикла «зелёный» – «красный»). interval := a + b 2 Обозначим за t время движения между светофорами на максимальной скорости. t := dist / 1000. Деление вещественное. 3 Обозначим за intervalTime момент в интервале работы второго светофора, когда мы подъезжаем на максимальной скорости. intervalTime := time % interval, где % — операция взятия вещественного остатка от деления вещественного числа на целое. 6/29 Всероссийская олимпиада школьников по информатике
  • 14. Задача 5. Светофоры «Светофоры» Идея решения на 100 баллов Вещественная арифметика Сложность O(1) 1 Обозначим за interval интервал светофора (время продолжения одного цикла «зелёный» – «красный»). interval := a + b 2 Обозначим за t время движения между светофорами на максимальной скорости. t := dist / 1000. Деление вещественное. 3 Обозначим за intervalTime момент в интервале работы второго светофора, когда мы подъезжаем на максимальной скорости. intervalTime := time % interval, где % — операция взятия вещественного остатка от деления вещественного числа на целое. 6/29 Всероссийская олимпиада школьников по информатике
  • 15. Задача 5. Светофоры Примеры реализация данной операции % на разных языках Java intervalTime = time % interval Pascal intervalTime := time - floor(time / (interval)) * (interval) C++ intervalTime = time - (int)(time / interval) * interval 7/29 Всероссийская олимпиада школьников по информатике
  • 16. Задача 5. Светофоры Примеры реализация данной операции % на разных языках Java intervalTime = time % interval Pascal intervalTime := time - floor(time / (interval)) * (interval) C++ intervalTime = time - (int)(time / interval) * interval 7/29 Всероссийская олимпиада школьников по информатике
  • 17. Задача 5. Светофоры Мы можем проехать на максимальной скорости через второй светофор если выполняется хотя бы одно из условий: №1. С первого светофора стартанём в момент перехода «красный» – «зелёный» и приедем ко второму светофору, когда на нём будет зелёный до перехода на красный. Это можно записать следующим образом: intervalTime <= a. 8/29 Всероссийская олимпиада школьников по информатике
  • 18. Задача 5. Светофоры №2. С первого светофора стартанём в момент перехода «зелёный» – «красный» и успеем подъехать ко второму светофору, когда на нём будет переход «красный» – «зелёный» и до переключения на красный. Это можно записать следующим образом: intervalTime >= b. 9/29 Всероссийская олимпиада школьников по информатике
  • 19. Задача 5. Светофоры 1 Если мы не успеваем проехать на максимальной скорости, то надо «притормозить» на время, пока продолжает гореть красный как в случае №2 выше: time := time + b - intervalTime. 2 Найти скорость через вещественное деление пути на время: speed := x / time. 10/29 Всероссийская олимпиада школьников по информатике
  • 20. Задача 5. Светофоры 1 Если мы не успеваем проехать на максимальной скорости, то надо «притормозить» на время, пока продолжает гореть красный как в случае №2 выше: time := time + b - intervalTime. 2 Найти скорость через вещественное деление пути на время: speed := x / time. 10/29 Всероссийская олимпиада школьников по информатике
  • 21. Задача 5. Светофоры Вопросы по задаче? 11/29 Всероссийская олимпиада школьников по информатике
  • 22. Задача 6. Кондиционеры «Кондиционеры» Идея решения на 100 баллов Без сортировки Сложность O(M ∗ 1000) 1 Прочитаем данные о классах в массив classes, где classes[i] — необходимая мощность кондиционера в i–м класе. 2 Создадим массив price, где price[i] — минимальная стоимость кондиционера с мощностью ≥ i. 3 Прочитав из файла данные об очередном кондиционере с мощностью b и стоимостью c, обновляем элементы price[1] . . . price[b]: i f p r i c e [ i ] > с then p r i c e [ i ] := c 12/29 Всероссийская олимпиада школьников по информатике
  • 23. Задача 6. Кондиционеры «Кондиционеры» Идея решения на 100 баллов Без сортировки Сложность O(M ∗ 1000) 1 Прочитаем данные о классах в массив classes, где classes[i] — необходимая мощность кондиционера в i–м класе. 2 Создадим массив price, где price[i] — минимальная стоимость кондиционера с мощностью ≥ i. 3 Прочитав из файла данные об очередном кондиционере с мощностью b и стоимостью c, обновляем элементы price[1] . . . price[b]: i f p r i c e [ i ] > с then p r i c e [ i ] := c 12/29 Всероссийская олимпиада школьников по информатике
  • 24. Задача 6. Кондиционеры «Кондиционеры» Идея решения на 100 баллов Без сортировки Сложность O(M ∗ 1000) 1 Прочитаем данные о классах в массив classes, где classes[i] — необходимая мощность кондиционера в i–м класе. 2 Создадим массив price, где price[i] — минимальная стоимость кондиционера с мощностью ≥ i. 3 Прочитав из файла данные об очередном кондиционере с мощностью b и стоимостью c, обновляем элементы price[1] . . . price[b]: i f p r i c e [ i ] > с then p r i c e [ i ] := c 12/29 Всероссийская олимпиада школьников по информатике
  • 25. Задача 6. Кондиционеры 1 Ответ для каждого класса i лежит в price[classes[i]]. 2 Ответом на задачу будет сумма ответов для всех классов. 3 Количество действий порядка M ∗ 1000, так как мощность не превышает 1000. 13/29 Всероссийская олимпиада школьников по информатике
  • 26. Задача 6. Кондиционеры 1 Ответ для каждого класса i лежит в price[classes[i]]. 2 Ответом на задачу будет сумма ответов для всех классов. 3 Количество действий порядка M ∗ 1000, так как мощность не превышает 1000. 13/29 Всероссийская олимпиада школьников по информатике
  • 27. Задача 6. Кондиционеры 1 Ответ для каждого класса i лежит в price[classes[i]]. 2 Ответом на задачу будет сумма ответов для всех классов. 3 Количество действий порядка M ∗ 1000, так как мощность не превышает 1000. 13/29 Всероссийская олимпиада школьников по информатике
  • 28. Задача 6. Кондиционеры «Кондиционеры» Идея решения на 100 баллов Сортировка + «жадный алгоритм». Сложность O(M ∗ log(M) + N ∗ log(N)) 1 Сортируем массив с кондиционерами (conds) по возрастанию пары <стоимость, мощность>. 2 Сортируем массив классов (classes) по возрастанию минимальной требуемой мощности кондиционеров. 14/29 Всероссийская олимпиада школьников по информатике
  • 29. Задача 6. Кондиционеры «Кондиционеры» Идея решения на 100 баллов Сортировка + «жадный алгоритм». Сложность O(M ∗ log(M) + N ∗ log(N)) 1 Сортируем массив с кондиционерами (conds) по возрастанию пары <стоимость, мощность>. 2 Сортируем массив классов (classes) по возрастанию минимальной требуемой мощности кондиционеров. 14/29 Всероссийская олимпиада школьников по информатике
  • 30. Задача 6. Кондиционеры 1 Пусть lastSelectedIdx — индекс минимального выбранного кондиционера. Изначально равен 0 (или 1, если массив от 1). 2 Идём по отсортированному массиву классов. 3 Для каждого класса либо подходит кондиционер conds[lastSelectedIdx], либо какой то «ближайший» справа в массиве conds более мощный. 4 Если кондиционер подходит (conds[lastSelectedIdx].power ≥ classes[i]), то добавляем к ответу его стоимость и переходим к следующему классу. 5 Если слабоват, то lastSelectedIdx := lastSelectedIdx + 1 и переходим к следующему кондиционеру, оставаясь в том же классе. 6 По условию задачи всегда существует хотя бы один тип кондиционеров, который можно поставить в любой класс. 15/29 Всероссийская олимпиада школьников по информатике
  • 31. Задача 6. Кондиционеры 1 Пусть lastSelectedIdx — индекс минимального выбранного кондиционера. Изначально равен 0 (или 1, если массив от 1). 2 Идём по отсортированному массиву классов. 3 Для каждого класса либо подходит кондиционер conds[lastSelectedIdx], либо какой то «ближайший» справа в массиве conds более мощный. 4 Если кондиционер подходит (conds[lastSelectedIdx].power ≥ classes[i]), то добавляем к ответу его стоимость и переходим к следующему классу. 5 Если слабоват, то lastSelectedIdx := lastSelectedIdx + 1 и переходим к следующему кондиционеру, оставаясь в том же классе. 6 По условию задачи всегда существует хотя бы один тип кондиционеров, который можно поставить в любой класс. 15/29 Всероссийская олимпиада школьников по информатике
  • 32. Задача 6. Кондиционеры 1 Пусть lastSelectedIdx — индекс минимального выбранного кондиционера. Изначально равен 0 (или 1, если массив от 1). 2 Идём по отсортированному массиву классов. 3 Для каждого класса либо подходит кондиционер conds[lastSelectedIdx], либо какой то «ближайший» справа в массиве conds более мощный. 4 Если кондиционер подходит (conds[lastSelectedIdx].power ≥ classes[i]), то добавляем к ответу его стоимость и переходим к следующему классу. 5 Если слабоват, то lastSelectedIdx := lastSelectedIdx + 1 и переходим к следующему кондиционеру, оставаясь в том же классе. 6 По условию задачи всегда существует хотя бы один тип кондиционеров, который можно поставить в любой класс. 15/29 Всероссийская олимпиада школьников по информатике
  • 33. Задача 6. Кондиционеры 1 Пусть lastSelectedIdx — индекс минимального выбранного кондиционера. Изначально равен 0 (или 1, если массив от 1). 2 Идём по отсортированному массиву классов. 3 Для каждого класса либо подходит кондиционер conds[lastSelectedIdx], либо какой то «ближайший» справа в массиве conds более мощный. 4 Если кондиционер подходит (conds[lastSelectedIdx].power ≥ classes[i]), то добавляем к ответу его стоимость и переходим к следующему классу. 5 Если слабоват, то lastSelectedIdx := lastSelectedIdx + 1 и переходим к следующему кондиционеру, оставаясь в том же классе. 6 По условию задачи всегда существует хотя бы один тип кондиционеров, который можно поставить в любой класс. 15/29 Всероссийская олимпиада школьников по информатике
  • 34. Задача 6. Кондиционеры Вопросы по задаче? 16/29 Всероссийская олимпиада школьников по информатике
  • 35. Задача 7. Конфеты «Конфеты» Идея решения на 40 баллов Сложность O(N2 ) 1 Если a + b + c > N (не сможем положить ни одну коробку), то подходит любой ящик с суммой размеров ≤ N. 2 Пусть x, y, z — количество коробок, которых влезает по длине, ширине и высоте в коробку. 3 Перебор всевозможных значений x и y и вычислении z по формуле z = n − ax − by c 4 Проверяем, стало ли произведение x × y × z больше текущего. 17/29 Всероссийская олимпиада школьников по информатике
  • 36. Задача 7. Конфеты «Конфеты» Идея решения на 40 баллов Сложность O(N2 ) 1 Если a + b + c > N (не сможем положить ни одну коробку), то подходит любой ящик с суммой размеров ≤ N. 2 Пусть x, y, z — количество коробок, которых влезает по длине, ширине и высоте в коробку. 3 Перебор всевозможных значений x и y и вычислении z по формуле z = n − ax − by c 4 Проверяем, стало ли произведение x × y × z больше текущего. 17/29 Всероссийская олимпиада школьников по информатике
  • 37. Задача 7. Конфеты «Конфеты» Идея решения на 70 баллов Динамическое программирование Сложность O(N) 1 Пусть p, q, r — количество коробок, которое помещается в ящик в длину, ширину и высоту. 2 Нам нужно максимизировать произведение p × q × r при ограничении a × p + b × q + c × r ≤ N. 3 Создадим массив vars длины n, где каждый элемент vars[i] содержит запись с полями p, q, r, такими, что a × p + b × q + c × r = i и при этом p × q × r максимально. 18/29 Всероссийская олимпиада школьников по информатике
  • 38. Задача 7. Конфеты «Конфеты» Идея решения на 70 баллов Динамическое программирование Сложность O(N) 1 Пусть p, q, r — количество коробок, которое помещается в ящик в длину, ширину и высоту. 2 Нам нужно максимизировать произведение p × q × r при ограничении a × p + b × q + c × r ≤ N. 3 Создадим массив vars длины n, где каждый элемент vars[i] содержит запись с полями p, q, r, такими, что a × p + b × q + c × r = i и при этом p × q × r максимально. 18/29 Всероссийская олимпиада школьников по информатике
  • 39. Задача 7. Конфеты Чтобы найти vars[i], рассмотрим элементы vars[i − a], vars[i − b] и vars[i − c] и выберем максимальный. Для vars[i − a] мы можем увеличить p на 1, тогда a ∗ (vars[i − a].p + 1) + b ∗ vars[i − a].q + c ∗ vars[i − a].r будет равно i. Для vars[i − b] мы можем увеличить q на 1, тогда a ∗ vars[i − a].p + b ∗ (vars[i − a].q + 1) + c ∗ vars[i − a].r будет равно i. Для vars[i − c] мы можем увеличить r на 1, тогда a ∗ vars[i − a].p + b ∗ vars[i − a].q + c ∗ (vars[i − a].r + 1) будет равно i. Заполнив массив vars, находим в нём такой элемент k, для которого p × q × r максимально. 19/29 Всероссийская олимпиада школьников по информатике
  • 40. Задача 7. Конфеты Чтобы найти vars[i], рассмотрим элементы vars[i − a], vars[i − b] и vars[i − c] и выберем максимальный. Для vars[i − a] мы можем увеличить p на 1, тогда a ∗ (vars[i − a].p + 1) + b ∗ vars[i − a].q + c ∗ vars[i − a].r будет равно i. Для vars[i − b] мы можем увеличить q на 1, тогда a ∗ vars[i − a].p + b ∗ (vars[i − a].q + 1) + c ∗ vars[i − a].r будет равно i. Для vars[i − c] мы можем увеличить r на 1, тогда a ∗ vars[i − a].p + b ∗ vars[i − a].q + c ∗ (vars[i − a].r + 1) будет равно i. Заполнив массив vars, находим в нём такой элемент k, для которого p × q × r максимально. 19/29 Всероссийская олимпиада школьников по информатике
  • 41. Задача 7. Конфеты Чтобы найти vars[i], рассмотрим элементы vars[i − a], vars[i − b] и vars[i − c] и выберем максимальный. Для vars[i − a] мы можем увеличить p на 1, тогда a ∗ (vars[i − a].p + 1) + b ∗ vars[i − a].q + c ∗ vars[i − a].r будет равно i. Для vars[i − b] мы можем увеличить q на 1, тогда a ∗ vars[i − a].p + b ∗ (vars[i − a].q + 1) + c ∗ vars[i − a].r будет равно i. Для vars[i − c] мы можем увеличить r на 1, тогда a ∗ vars[i − a].p + b ∗ vars[i − a].q + c ∗ (vars[i − a].r + 1) будет равно i. Заполнив массив vars, находим в нём такой элемент k, для которого p × q × r максимально. 19/29 Всероссийская олимпиада школьников по информатике
  • 42. Задача 7. Конфеты «Конфеты» Идея решения на 100 баллов Сложность O( 3 √ n2) 1 Полагаем, что a ≥ b ≥ c. Если это не так, то отсортируем их по убыванию, но запомним - кто был каким. 2 Берём x в n 3a − 3 √ n, n 3a + 3 √ n . 3 Берём y в n−ax 2b − 3 √ n, n−ax 2b + 3 √ n . 4 Получаем z = n−ax−by c и проверяем, стало ли произведение x × y × z больше текущего. 20/29 Всероссийская олимпиада школьников по информатике
  • 43. Задача 7. Конфеты «Конфеты» Идея решения на 100 баллов Сложность O( 3 √ n2) 1 Полагаем, что a ≥ b ≥ c. Если это не так, то отсортируем их по убыванию, но запомним - кто был каким. 2 Берём x в n 3a − 3 √ n, n 3a + 3 √ n . 3 Берём y в n−ax 2b − 3 √ n, n−ax 2b + 3 √ n . 4 Получаем z = n−ax−by c и проверяем, стало ли произведение x × y × z больше текущего. 20/29 Всероссийская олимпиада школьников по информатике
  • 44. Задача 7. Конфеты Вопросы по задаче? 21/29 Всероссийская олимпиада школьников по информатике
  • 45. Задача 8. Волонтёры «Волонтёры» Формализация задачи Члены научного комитета образуют дерево, члены технического комитета — тоже дерево. У этих деревьев общие листья — волонтеры. Требуется сосчитать количество пар вершин (u, v), где u — вершина из левого дерева, v — из правого, и между u и v есть путь, идущий всегда слева направо. 22/29 Всероссийская олимпиада школьников по информатике
  • 46. Задача 8. Волонтёры «Волонтёры» Формализация задачи Члены научного комитета образуют дерево, члены технического комитета — тоже дерево. У этих деревьев общие листья — волонтеры. Требуется сосчитать количество пар вершин (u, v), где u — вершина из левого дерева, v — из правого, и между u и v есть путь, идущий всегда слева направо. 22/29 Всероссийская олимпиада школьников по информатике
  • 47. Задача 8. Волонтёры «Волонтёры» Идея решения на 50 баллов Сложность O(M ∗ K + N + M + K) 1 Для каждой вершины каждого дерева найдём номера листьев, которые ей соответствуют. 2 Любой вершине соответствуют последовательные номера листьев без пропусков. 3 Диапазон листьев будем хранить в каждой вершине как два числа v1 и v2 — начальный номер листа и конечный. 4 Перебираем все пары вершин (u, v) и определяем, имеют ли отнесенные к ним отрезки общее пересечение. 23/29 Всероссийская олимпиада школьников по информатике
  • 48. Задача 8. Волонтёры «Волонтёры» Идея решения на 50 баллов Сложность O(M ∗ K + N + M + K) 1 Для каждой вершины каждого дерева найдём номера листьев, которые ей соответствуют. 2 Любой вершине соответствуют последовательные номера листьев без пропусков. 3 Диапазон листьев будем хранить в каждой вершине как два числа v1 и v2 — начальный номер листа и конечный. 4 Перебираем все пары вершин (u, v) и определяем, имеют ли отнесенные к ним отрезки общее пересечение. 23/29 Всероссийская олимпиада школьников по информатике
  • 49. Задача 8. Волонтёры «Волонтёры» Идея решения на 50 баллов Сложность O(M ∗ K + N + M + K) 1 Для каждой вершины каждого дерева найдём номера листьев, которые ей соответствуют. 2 Любой вершине соответствуют последовательные номера листьев без пропусков. 3 Диапазон листьев будем хранить в каждой вершине как два числа v1 и v2 — начальный номер листа и конечный. 4 Перебираем все пары вершин (u, v) и определяем, имеют ли отнесенные к ним отрезки общее пересечение. 23/29 Всероссийская олимпиада школьников по информатике
  • 50. Задача 8. Волонтёры «Волонтёры» Идея решения на 50 баллов Сложность O(M ∗ K + N + M + K) 1 Для каждой вершины каждого дерева найдём номера листьев, которые ей соответствуют. 2 Любой вершине соответствуют последовательные номера листьев без пропусков. 3 Диапазон листьев будем хранить в каждой вершине как два числа v1 и v2 — начальный номер листа и конечный. 4 Перебираем все пары вершин (u, v) и определяем, имеют ли отнесенные к ним отрезки общее пересечение. 23/29 Всероссийская олимпиада школьников по информатике
  • 51. Задача 8. Волонтёры Поиск v1 и v2 для вершин дерева 1 Найти этот номера очень легко с помощью поиска в глубину. 2 Пусть мы рассматриваем вершину p. 3 Посетим рекурсивно всех её детей, в результате вычислятся их диапазоны номеров листьев. 4 Возьмём среди этих номеров самый маленький и самый большой — это и будет номера v1 и v2 для вершины p. 24/29 Всероссийская олимпиада школьников по информатике
  • 52. Задача 8. Волонтёры Поиск v1 и v2 для вершин дерева 1 Найти этот номера очень легко с помощью поиска в глубину. 2 Пусть мы рассматриваем вершину p. 3 Посетим рекурсивно всех её детей, в результате вычислятся их диапазоны номеров листьев. 4 Возьмём среди этих номеров самый маленький и самый большой — это и будет номера v1 и v2 для вершины p. 24/29 Всероссийская олимпиада школьников по информатике
  • 53. Задача 8. Волонтёры Поиск v1 и v2 для вершин дерева 1 Найти этот номера очень легко с помощью поиска в глубину. 2 Пусть мы рассматриваем вершину p. 3 Посетим рекурсивно всех её детей, в результате вычислятся их диапазоны номеров листьев. 4 Возьмём среди этих номеров самый маленький и самый большой — это и будет номера v1 и v2 для вершины p. 24/29 Всероссийская олимпиада школьников по информатике
  • 54. Задача 8. Волонтёры «Волонтёры» Улучшение решения до 100 баллов Сложность O((M + K) ∗ log(M + K) + N + M + K) 1 Полученные диапазоны номеров листьев в вершинах можно рассматривать как отрезки на координатной прямой. 2 Обозначим их в левом дереве синими, а в правом - красными. 3 Нам нужно найти количество пар синих и красных отрезков, которые пересекаются. 25/29 Всероссийская олимпиада школьников по информатике
  • 55. Задача 8. Волонтёры «Волонтёры» Улучшение решения до 100 баллов Сложность O((M + K) ∗ log(M + K) + N + M + K) 1 Полученные диапазоны номеров листьев в вершинах можно рассматривать как отрезки на координатной прямой. 2 Обозначим их в левом дереве синими, а в правом - красными. 3 Нам нужно найти количество пар синих и красных отрезков, которые пересекаются. 25/29 Всероссийская олимпиада школьников по информатике
  • 56. Задача 8. Волонтёры «Волонтёры» Улучшение решения до 100 баллов Сложность O((M + K) ∗ log(M + K) + N + M + K) 1 Полученные диапазоны номеров листьев в вершинах можно рассматривать как отрезки на координатной прямой. 2 Обозначим их в левом дереве синими, а в правом - красными. 3 Нам нужно найти количество пар синих и красных отрезков, которые пересекаются. 25/29 Всероссийская олимпиада школьников по информатике
  • 57. Задача 8. Волонтёры 1 Возьмём координаты начал и концов всех отрезков и занесём их в массив. Каждый элемент массива будет хранить три поля: координату признак (начало или конец отрезка) цвет (красный или синий) 2 Отсортируем массив: 1 Сортируем по возрастанию координаты 2 Для одинаковых координат сортируем по типу (сначала открывающие, потом закрывающие) 3 Сортируем по цвету (сначала синие, потом красные) 3 Заведём две переменные: red — количество открытых красных отрезков, blue — количество открытых синих. 26/29 Всероссийская олимпиада школьников по информатике
  • 58. Задача 8. Волонтёры 1 Возьмём координаты начал и концов всех отрезков и занесём их в массив. Каждый элемент массива будет хранить три поля: координату признак (начало или конец отрезка) цвет (красный или синий) 2 Отсортируем массив: 1 Сортируем по возрастанию координаты 2 Для одинаковых координат сортируем по типу (сначала открывающие, потом закрывающие) 3 Сортируем по цвету (сначала синие, потом красные) 3 Заведём две переменные: red — количество открытых красных отрезков, blue — количество открытых синих. 26/29 Всероссийская олимпиада школьников по информатике
  • 59. Задача 8. Волонтёры 1 Возьмём координаты начал и концов всех отрезков и занесём их в массив. Каждый элемент массива будет хранить три поля: координату признак (начало или конец отрезка) цвет (красный или синий) 2 Отсортируем массив: 1 Сортируем по возрастанию координаты 2 Для одинаковых координат сортируем по типу (сначала открывающие, потом закрывающие) 3 Сортируем по цвету (сначала синие, потом красные) 3 Заведём две переменные: red — количество открытых красных отрезков, blue — количество открытых синих. 26/29 Всероссийская олимпиада школьников по информатике
  • 60. Задача 8. Волонтёры 1 Обозначим за answer ответ в задаче. 2 Пройдёмся по массиву: Встав на очередной элемент, рассмотрим возможные случаи: 1 Если открывается синий отрезок: blue := blue + 1 answer := answer + red (потому что этот отрезок конфликтует со всеми открытыми на данный момент красными отрезками). 2 Если открывается красный отрезок: red := red + 1 answer := answer + blue 3 Если отрезок закрывается: blue := blue - 1 либо red := red - 1 соответственно. 27/29 Всероссийская олимпиада школьников по информатике
  • 61. Задача 8. Волонтёры 1 Обозначим за answer ответ в задаче. 2 Пройдёмся по массиву: Встав на очередной элемент, рассмотрим возможные случаи: 1 Если открывается синий отрезок: blue := blue + 1 answer := answer + red (потому что этот отрезок конфликтует со всеми открытыми на данный момент красными отрезками). 2 Если открывается красный отрезок: red := red + 1 answer := answer + blue 3 Если отрезок закрывается: blue := blue - 1 либо red := red - 1 соответственно. 27/29 Всероссийская олимпиада школьников по информатике
  • 62. Задача 8. Волонтёры 1 Обозначим за answer ответ в задаче. 2 Пройдёмся по массиву: Встав на очередной элемент, рассмотрим возможные случаи: 1 Если открывается синий отрезок: blue := blue + 1 answer := answer + red (потому что этот отрезок конфликтует со всеми открытыми на данный момент красными отрезками). 2 Если открывается красный отрезок: red := red + 1 answer := answer + blue 3 Если отрезок закрывается: blue := blue - 1 либо red := red - 1 соответственно. 27/29 Всероссийская олимпиада школьников по информатике
  • 63. Задача 8. Волонтёры 1 Обозначим за answer ответ в задаче. 2 Пройдёмся по массиву: Встав на очередной элемент, рассмотрим возможные случаи: 1 Если открывается синий отрезок: blue := blue + 1 answer := answer + red (потому что этот отрезок конфликтует со всеми открытыми на данный момент красными отрезками). 2 Если открывается красный отрезок: red := red + 1 answer := answer + blue 3 Если отрезок закрывается: blue := blue - 1 либо red := red - 1 соответственно. 27/29 Всероссийская олимпиада школьников по информатике
  • 64. Задача 8. Волонтёры 1 Обозначим за answer ответ в задаче. 2 Пройдёмся по массиву: Встав на очередной элемент, рассмотрим возможные случаи: 1 Если открывается синий отрезок: blue := blue + 1 answer := answer + red (потому что этот отрезок конфликтует со всеми открытыми на данный момент красными отрезками). 2 Если открывается красный отрезок: red := red + 1 answer := answer + blue 3 Если отрезок закрывается: blue := blue - 1 либо red := red - 1 соответственно. 27/29 Всероссийская олимпиада школьников по информатике
  • 65. Задача 8. Волонтёры 1 Обозначим за answer ответ в задаче. 2 Пройдёмся по массиву: Встав на очередной элемент, рассмотрим возможные случаи: 1 Если открывается синий отрезок: blue := blue + 1 answer := answer + red (потому что этот отрезок конфликтует со всеми открытыми на данный момент красными отрезками). 2 Если открывается красный отрезок: red := red + 1 answer := answer + blue 3 Если отрезок закрывается: blue := blue - 1 либо red := red - 1 соответственно. 27/29 Всероссийская олимпиада школьников по информатике
  • 66. Задача 8. Волонтёры Вопросы по задаче? 28/29 Всероссийская олимпиада школьников по информатике
  • 67. Заключение Спасибо за внимание! 29/29 Всероссийская олимпиада школьников по информатике