SlideShare a Scribd company logo
1 of 51
Download to read offline
Всероссийская олимпиада школьников по
информатике
Региональный этап, I тур
Разбор задач
Андрианов И. А.
Стрекаловский О. А.
Вологодский государственный университет
Факультет прикладной математики,
компьютерных технологий и физики
Вологда
2016 г.
1/41 Всероссийская олимпиада школьников по информатике
«Призы»
Основная идея
Классический алгоритм поиска второго максимума в массиве.
2/41 Всероссийская олимпиада школьников по информатике
«Призы»
Будем поддерживать две переменные: текущий максимум в
массиве и второй по величине элемент.
Тогда при добавлении в рассмотрение очередного приза
обновим при необходимости первый и второй максимум.
3/41 Всероссийская олимпиада школьников по информатике
«Призы»
1 int n = readInt ();
2 int a = readInt ();
3 int b = readInt ();
4 int max = max(a, b);
5 int secondMax = min(a, b);
6 print(secondMax + "␣");
7 for (int i = 3; i <= n; i++) {
8 int num = readInt ();
9 if (num > max) {
10 print(max + "␣");
11 secondMax = max;
12 max = num;
13 } else if (secondMax < num) {
14 print(num + "␣");
15 secondMax = num;
16 } else {
17 print(secondMax + "␣");
18 }
19 }
4/41 Всероссийская олимпиада школьников по информатике
«Призы»
Решение на С++ с multiset:
1 int n;
2 std::cin >> n;
3 std:: multiset <int > ma;
4 int x, y;
5 std::cin >> x >> y;
6 ma.insert(x);
7 ma.insert(y);
8 std:: cout << *ma.begin () << "␣";
9 for (int i = 3; i <= n; i++) {
10 std::cin >> x;
11 ma.insert(x);
12 ma.erase(ma.begin ());
13 std:: cout << *ma.begin () << "␣";
14 }
5/41 Всероссийская олимпиада школьников по информатике
«Призы»
Типичные ошибки
Неэффективное решение.
Много проходов по исходным данным в поисках второго
максимума.
Второй максимум — это не всегда предыдущий максимум,
увиденный при проходе по массиву.
Тест: 1 3 2.
6/41 Всероссийская олимпиада школьников по информатике
Вопросы по задаче?
7/41 Всероссийская олимпиада школьников по информатике
«Космическое поселение»
Основные идеи
Перебор двух вариантов ориентации модулей.
Двоичный поиск по величине толщины защиты жилого
отсека при фиксированной ориентации модулей.
Контроль переполнения 64-x разрядного типа данных.
8/41 Всероссийская олимпиада школьников по информатике
«Космическое поселение»
Пусть модуль ориентирован так, что сторона длиной a
ориентирована вдоль стороны поля длиной w.
Тогда после установки защиты толщиной d вдоль этой
стороны можно установить ⌊w/(a + 2d)⌋ модулей.
Аналогично, вдоль другой стороны можно установить
⌊h/(b + 2d)⌋ модулей.
Всего можно установить (⌊w/(a + 2d)⌋) × (⌊h/(b + 2d)⌋)
модулей.
9/41 Всероссийская олимпиада школьников по информатике
«Космическое поселение»
Пример решения без переполнения 64–x разрядного типа
1 long long L = 0;
2 long long R = min( (w - a) / 2, (h - b) / 2) + 1;
3 while (L + 1 < R) {
4 long long M = (L + R) / 2;
5 long long ad = a + 2 * M;
6 long long bd = b + 2 * M;
7 long long ac = w / ad;
8 long long bc = h / bd;
9 if (ac * bc >= n) {
10 L = M;
11 } else {
12 R = M;
13 }
14 }
15 return L;
«А. C. Станкевич. Лекция 2: Сортировка и поиск».1
1
http://www.youtube.com/watch?v=qkLLcdgJj_o
10/41 Всероссийская олимпиада школьников по информатике
«Космическое поселение»
Типичные ошибки
Неэффективное решение.
Слишком большой перебор величины защиты.
Переполнение 64-x разрядного типа данных при выборе
слишком большой правой границы поиска или при
промежуточных операциях.
11/41 Всероссийская олимпиада школьников по информатике
«Космическое поселение»
Типичные ошибки
Неэффективное решение.
Слишком большой перебор величины защиты.
Переполнение 64-x разрядного типа данных при выборе
слишком большой правой границы поиска или при
промежуточных операциях.
Решение на Java
В Java 8 появились методы:
Math.addExact(long x, long y)
Math.multiplyExact(long x, long y)
Кидают ArithmeticException в случае переполнения при
выполнении операции.
11/41 Всероссийская олимпиада школьников по информатике
Вопросы по задаче?
12/41 Всероссийская олимпиада школьников по информатике
«Странные строки»
Строка z является странной, если для нее выполняются
следующие свойства:
z содержит не более двух различных символов;
все одинаковые символы в z идут подряд.
13/41 Всероссийская олимпиада школьников по информатике
«Странные строки»
Строка z является странной, если для нее выполняются
следующие свойства:
z содержит не более двух различных символов;
все одинаковые символы в z идут подряд.
Таким образом, для определения странности строки
требуется найти количество ее подстрок, которые имеют
такую структуру.
Сделаем это в два этапа.
13/41 Всероссийская олимпиада школьников по информатике
«Странные строки»
Этап 1. Подстроки из повторяющихся символов
Если в строке длиной N встречается только один символ, то её
странность равна N.
14/41 Всероссийская олимпиада школьников по информатике
«Странные строки»
Этап 1. Подстроки из повторяющихся символов
Пусть в строке встречаются подстроки из одного и того же
символа.
15/41 Всероссийская олимпиада школьников по информатике
«Странные строки»
Этап 1. Подстроки из повторяющихся символов
Пусть в строке встречаются подстроки из одного и того же
символа.
Пусть таких подстрок K и их размеры L1, L2, . . . , LK.
15/41 Всероссийская олимпиада школьников по информатике
«Странные строки»
Этап 1. Подстроки из повторяющихся символов
Пусть в строке встречаются подстроки из одного и того же
символа.
Пусть таких подстрок K и их размеры L1, L2, . . . , LK.
Тогда каждый такой символ добавляет к странности
исходной строки max Li, где 1 ≤ i ≤ K.
Пример: . . . aaaa
4
. . . aa
2
. . .
Подстроки «aaaa» и «aa» являются странными.
Из них можно выделить подстроки, которые являются
подстроками исходной строки: «a», «aa», «aaa», «aaaa».
В итоге символ «a» создаёт 4 подстроки и добавляет 4 к
общей странности строки.
15/41 Всероссийская олимпиада школьников по информатике
«Странные строки»
Этап 2. Подстроки из двух разных символов
Будем решать задачу независимо для каждой
упорядоченной пары (a, b) символов.
16/41 Всероссийская олимпиада школьников по информатике
«Странные строки»
Этап 2. Подстроки из двух разных символов
Будем решать задачу независимо для каждой
упорядоченной пары (a, b) символов.
Пусть в строке есть подстроки вида X aa . . . a
ki
bb . . . b
li
Y , где
множество X — любой символ = a (или начало строки), а
Y — любой символ = b (или конец строки).
16/41 Всероссийская олимпиада школьников по информатике
«Странные строки»
Этап 2. Подстроки из двух разных символов
Будем решать задачу независимо для каждой
упорядоченной пары (a, b) символов.
Пусть в строке есть подстроки вида X aa . . . a
ki
bb . . . b
li
Y , где
множество X — любой символ = a (или начало строки), а
Y — любой символ = b (или конец строки).
Поместим все пары (ki, li) в массив.
16/41 Всероссийская олимпиада школьников по информатике
«Странные строки»
Этап 2. Подстроки из двух разных символов
Будем решать задачу независимо для каждой
упорядоченной пары (a, b) символов.
Пусть в строке есть подстроки вида X aa . . . a
ki
bb . . . b
li
Y , где
множество X — любой символ = a (или начало строки), а
Y — любой символ = b (или конец строки).
Поместим все пары (ki, li) в массив.
Теперь нам надо найти число пар (k, l), таких, что
найдется (ki, li), такая что 1 ≤ k ≤ ki и 1 ≤ l ≤ li.
16/41 Всероссийская олимпиада школьников по информатике
«Странные строки»
Этап 2. Подстроки из двух разных символов
Для поиска числа таких пар отсортируем все пары по ki, а
затем по li.
17/41 Всероссийская олимпиада школьников по информатике
«Странные строки»
Этап 2. Подстроки из двух разных символов
Для поиска числа таких пар отсортируем все пары по ki, а
затем по li.
Для каждой пары (ki, li) заменим li на максимум lj, где
kj ≥ ki.
17/41 Всероссийская олимпиада школьников по информатике
«Странные строки»
Этап 2. Подстроки из двух разных символов
Для поиска числа таких пар отсортируем все пары по ki, а
затем по li.
Для каждой пары (ki, li) заменим li на максимум lj, где
kj ≥ ki.
Теперь оставим по одной паре с каждым ki и
просуммируем величины (ki − ki−1) × li для всех i.
17/41 Всероссийская олимпиада школьников по информатике
«Странные строки»
Этап 2. Подстроки из двух разных символов
Для поиска числа таких пар отсортируем все пары по ki, а
затем по li.
Для каждой пары (ki, li) заменим li на максимум lj, где
kj ≥ ki.
Теперь оставим по одной паре с каждым ki и
просуммируем величины (ki − ki−1) × li для всех i.
Получившееся значение добавим к ответу на задачу.
17/41 Всероссийская олимпиада школьников по информатике
«Странные строки»
Это алгоритм поиска площади объединения прямоугольников с
осями, параллельными осям координат, общим углом в (0, 0) и
положительными координатами противоположного угла.
18/41 Всероссийская олимпиада школьников по информатике
«Странные строки»
Типичные ошибки
Неэффективное решение.
Проверка подстрок на странность «в лоб».
Неэффективное удаление дубликатов с помощью вставки
строк в структуру данных «множество».
19/41 Всероссийская олимпиада школьников по информатике
Вопросы по задаче?
20/41 Всероссийская олимпиада школьников по информатике
«Поездка на каникулах»
Жадный алгоритм, дающий наименьшее число пересадок:
Покупаем билет до станции назначения, если это
возможно, иначе покупаем билет до самой дальней
возможной станции. Для этой станции действуем
аналогично, и т.д.
Пояснение: незачем заранее пересаживаться на другое
место, пока свободно прежнее
21/41 Всероссийская олимпиада школьников по информатике
«Поездка на каникулах»
1 Пусть go1[i] — максимальный номер станции, до которой
можно доехать от станции i, используя ровно 1 билет.
2 Допустим, массив go1 каким–то образом построен, и
нужно проехать от f до s.
3 Тогда билеты надо покупать на станциях f, go1[f],
go1[go1[f]] и т.д.
4 Обработка одного варианта поездки при этом выполняется
за O(N) — то есть при условии эффективного построения
массива go1 решаем первые две подзадачи.
22/41 Всероссийская олимпиада школьников по информатике
«Поездка на каникулах»
Построение массива go1
Наивное построение — квадратичная или более высокая
вычислительная сложность.
Позволяет решить лишь подзадачу 1.
Более эффективное построение:
Будем говорить, что место a свободно на протяжении
отрезка [c, d], если никакой из проданных билетов не
занимает это место между станциями c и d.
23/41 Всероссийская олимпиада школьников по информатике
«Поездка на каникулах»
Построение массива go1. Шаг №1
Построим все максимальные свободные отрезки для каждого
места:
1 Вначале для каждого места имеется один свободный
отрезок — от 1 до n.
2 Отсортируем все билеты с данным местом по станции
отправления.
3 Будем рассматривать билеты в этом порядке (удобно
представлять, что их в таком порядке покупали).
4 Каждый следующий билет вырезает кусок из последнего
отрезка, расщепляя его на два.
24/41 Всероссийская олимпиада школьников по информатике
«Поездка на каникулах»
Построение массива go1. Шаг №1
Пример
Пусть N = 10, рассматриваем место №1.
1 Вначале место №1 свободно на всём пути – один отрезок
[1, 10].
2 Куплен билет от 2 до 5 — стало 2 отрезка: [1, 2], [5, 10].
3 Куплен билет от 8 до 9 — стало 3 отрезка: [1, 2], [5, 8],
[9, 10].
4 ...
25/41 Всероссийская олимпиада школьников по информатике
«Поездка на каникулах»
Пример реализации шага №1
1 std:: sort(tickets.begin (), tickets.end ());
2 std::vector <std::vector <Range > > r(nPlaces);
3 for (int i = 0; i < nPlaces; i++) {
4 r[i]. push_back(Range (0, n - 1));
5 }
6 for (Ticket &t : tickets) {
7 r[t.place ]. back ().to = t.from;
8 if (t.to != n - 1) {
9 r[t.place ]. push_back(Range(t.to , n - 1));
10 }
11 }
26/41 Всероссийская олимпиада школьников по информатике
«Поездка на каникулах»
Построение массива go1. Шаг №2
Объединим множества свободных отрезков всех мест и
отсортируем их по начальной станции.
Пример
Пусть у нас есть два места:
место №1 — отрезки [1, 4], [6, 8];
место №2 — отрезки [1, 7], [8, 9];
Результат объединения и сортировки массива отрезков:
[1, 7], [1, 4], [6, 8], [8, 9].
27/41 Всероссийская олимпиада школьников по информатике
«Поездка на каникулах»
Пример реализации шага №2
1 std::vector <Range > ranges;
2 for (int i = 0; i < nPlaces; i++) {
3 std:: copy(
4 r[i]. begin (),
5 r[i].end (),
6 back_inserter(ranges)
7 );
8 }
9 std:: sort(ranges.begin (), ranges.end ());
28/41 Всероссийская олимпиада школьников по информатике
«Поездка на каникулах»
Построение массива go1. Шаг №3
Построим все максимальные свободные отрезки для каждого
места:
1 Проходим по всем станциям и одновременно по
полученному массиву отрезков, при этом храним и
обновляем самый правый конец отрезка, который у нас
встречался.
2 На каждом шаге записываем это значение в массив go1
(но только если оно больше текущей станции).
29/41 Всероссийская олимпиада школьников по информатике
«Поездка на каникулах»
Построение массива go1. Шаг №3
Пример
Полученный ранее массив отрезков: [1, 7], [1, 4], [6, 8], [8, 9].
Станция №1. В массиве проходим по двум первым
элементам, на третьем остановились. Самый правый конец
= 7, то есть go1[1] = 7.
Станция №2. В массиве остаёмся на том же месте. Самый
правый конец всё еще 7, то есть go1[2]=7.
По аналогии go1[3] = go1[4] = go1[5] = 7
Станция №6. В массиве проходим по следующим двум
элементам, самый правый конец = 9. Отсюда go1[6]=9.
По аналогии go1[7] =9, go1[8]=9.
Поскольку самый правый конец = 9 — не больше номера
станции, то go1[9] = 0. Аналогично, go1[10]=0.
30/41 Всероссийская олимпиада школьников по информатике
«Поездка на каникулах»
Пример реализации шага №3
1 std::vector <int > go1(n);
2 int rightmost = 0, range = 0;
3 for (int i = 0; i < n; i++) {
4 while (range < (int)ranges.size ()
5 && ranges[range ]. from == i) {
6 rightmost = std::max(
7 rightmost , ranges[range ].to);
8 range ++;
9 }
10 if (rightmost > i) {
11 go1[i] = rightmost;
12 }
13 }
Обратите внимание на сходство с алгоритмом вычисления
z-функции для строк
31/41 Всероссийская олимпиада школьников по информатике
«Поездка на каникулах»
Альтернативный вариант реализации шага №3. Построение массива go1
Будем поддерживать множество «открытых» свободных
отрезков, которые начинаются не позже рассматриваемой
станции, в структуре данных, которая позволяет искать
максимум по ключу (например, двоичная куча, дерево отрезков
или std::set).
В качестве ключа используем конец отрезка.
1 Рассматривая очередную станцию i, добавим все
свободные отрезки, которые в ней начинаются, в
множество открытых отрезков.
2 Теперь go1[i] равно максимальному концу открытого
отрезка, либо i, если множество открытых отрезков пусто,
или все они заканчиваются до i.
32/41 Всероссийская олимпиада школьников по информатике
«Поездка на каникулах»
Подзадача №3
Нужно на каждый запрос отвечать быстрее, чем за O(n).
Варианты:
Sqrt–декомпозиция — O( (n));
Метод двоичных подъёмов — O(log(n));
33/41 Всероссийская олимпиада школьников по информатике
«Поездка на каникулах»
Решение подзадачи №3 методом sqrt–декомпозиции
1 Для каждой станции i делаем (n) прыжков по массиву
go1 (то есть i → go1(i) → go1(go1(i)) → . . . ) и
запоминаем, где мы оказались.
2 Пусть skip[i] — станция, в которую мы попадём, если
сделать (n) прыжков по массиву go1.
34/41 Всероссийская олимпиада школьников по информатике
«Поездка на каникулах»
Решение подзадачи №3 методом sqrt–декомпозиции
Теперь мы умеем делать не только малые прыжки длиной 1, но
и большие прыжки длиной (n).
Ответ на очередной запрос ищется так:
1 Вначале совершаем большие прыжки, пока это возможно
и пока не выйдем за конечную станцию.
2 Возвращаемся к предыдущему шагу и совершаем малые
прыжки, пока не придём в конечную станцию или станцию
после неё.
(200000) ≈ 450
Максимальное количество действий порядка
2 × 200000 × 450 = 180 миллионов
35/41 Всероссийская олимпиада школьников по информатике
«Поездка на каникулах»
Пример заполнения массива skip и поиска ответа на запрос
1 int SKIP = sqrt(n);
2 std::vector <int > skip(n);
3 for (int i = 0; i + SKIP < n; i++) {
4 int j = i, k;
5 for (k = 0; k < SKIP && go1[j] > 0; k++)
6 j = go1[j];
7 if (k == SKIP)
8 skip[i] = j;
9 }
10 // поиск ответа
11 while (go1[from] < to) {
12 if (skip[from] > 0 && skip[from] < to) {
13 answer += SKIP;
14 from = skip[from ];
15 } else {
16 answer ++;
17 from = go1[from ];
18 }
19 }
36/41 Всероссийская олимпиада школьников по информатике
«Поездка на каникулах»
Решение подзадачи №3 методом двоичных подъемов
Пусть go[i][j] равна максимальному номеру станции, до
которого можно доехать от станции j, используя не более 2i
билетов.
Алгоритм построения матрицы go основан на следующей идее:
1 Пусть можно от j доехать максимум до u, используя не
более 2i−1 билетов.
2 Пусть от u можно доехать максимум до v, используя не
более 2i−1 билетов.
3 Тогда от j можно доехать до v, используя не более 2i
билетов.
37/41 Всероссийская олимпиада школьников по информатике
«Поездка на каникулах»
Пример заполнения массива go
1 for (int i = 1; i <= sz; i++) {
2 for (int j = 0; j < n; j++) {
3 int u = go[i - 1][j];
4 go[i][j] = go[i - 1][u];
5 }
6 }
В качестве sz следует выбрать минимальную величину, такую
что 2sz ≥ n.
38/41 Всероссийская олимпиада школьников по информатике
«Поездка на каникулах»
Поиск ответа на запрос с помощью метода двоичных подъемов
Запрос на поездку от fr до to
1 if (go[sz][fr] < to) {
2 cout << -1 << endl;
3 } else {
4 int steps = 0;
5 int curK = sz;
6 while (go1[fr] < to) {
7 while (go[curK ][fr] >= to) {
8 curK --;
9 }
10 steps += 1 << curK;
11 fr = go[curK ][fr];
12 }
13 cout << steps + 1 << endl;
14 }
39/41 Всероссийская олимпиада школьников по информатике
Вопросы по задаче?
40/41 Всероссийская олимпиада школьников по информатике
Заключение
Спасибо за внимание!
41/41 Всероссийская олимпиада школьников по информатике

More Related Content

What's hot

20091115 algorithmsfornphardproblems kulikov_lecture09
20091115 algorithmsfornphardproblems kulikov_lecture0920091115 algorithmsfornphardproblems kulikov_lecture09
20091115 algorithmsfornphardproblems kulikov_lecture09
Computer Science Club
 
Решение краевых задач методом конечных элементов
Решение краевых задач методом конечных элементовРешение краевых задач методом конечных элементов
Решение краевых задач методом конечных элементов
Theoretical mechanics department
 
уравнение с двумя переменными презентация
уравнение с двумя переменными презентацияуравнение с двумя переменными презентация
уравнение с двумя переменными презентация
svetlana797
 
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
Nikolay Grebenshikov
 
20071111 efficientalgorithms kulikov_lecture06
20071111 efficientalgorithms kulikov_lecture0620071111 efficientalgorithms kulikov_lecture06
20071111 efficientalgorithms kulikov_lecture06
Computer Science Club
 
20111202 machine learning_nikolenko_lecture03
20111202 machine learning_nikolenko_lecture0320111202 machine learning_nikolenko_lecture03
20111202 machine learning_nikolenko_lecture03
Computer Science Club
 
20070930 efficientalgorithms kulikov_lecture02
20070930 efficientalgorithms kulikov_lecture0220070930 efficientalgorithms kulikov_lecture02
20070930 efficientalgorithms kulikov_lecture02
Computer Science Club
 
9 1.1 - системы счисления
9 1.1 - системы счисления9 1.1 - системы счисления
9 1.1 - системы счисления
jula-mam
 

What's hot (20)

эскизирование графиков
эскизирование графиковэскизирование графиков
эскизирование графиков
 
05.01.2015. теория график функции у=х 2
05.01.2015. теория   график функции у=х 205.01.2015. теория   график функции у=х 2
05.01.2015. теория график функции у=х 2
 
презентация приложение 1
презентация приложение 1презентация приложение 1
презентация приложение 1
 
20091115 algorithmsfornphardproblems kulikov_lecture09
20091115 algorithmsfornphardproblems kulikov_lecture0920091115 algorithmsfornphardproblems kulikov_lecture09
20091115 algorithmsfornphardproblems kulikov_lecture09
 
Решение краевых задач методом конечных элементов
Решение краевых задач методом конечных элементовРешение краевых задач методом конечных элементов
Решение краевых задач методом конечных элементов
 
уравнение с двумя переменными презентация
уравнение с двумя переменными презентацияуравнение с двумя переменными презентация
уравнение с двумя переменными презентация
 
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
 
Лекция №8 "Методы снижения размерности пространства"
Лекция №8 "Методы снижения размерности пространства" Лекция №8 "Методы снижения размерности пространства"
Лекция №8 "Методы снижения размерности пространства"
 
20071111 efficientalgorithms kulikov_lecture06
20071111 efficientalgorithms kulikov_lecture0620071111 efficientalgorithms kulikov_lecture06
20071111 efficientalgorithms kulikov_lecture06
 
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
 
Лекция №5 "Обработка текстов, Naive Bayes"
Лекция №5 "Обработка текстов, Naive Bayes" Лекция №5 "Обработка текстов, Naive Bayes"
Лекция №5 "Обработка текстов, Naive Bayes"
 
2100. 4 класс Урок 2.29. Решение задач
2100. 4 класс Урок 2.29. Решение задач2100. 4 класс Урок 2.29. Решение задач
2100. 4 класс Урок 2.29. Решение задач
 
20111202 machine learning_nikolenko_lecture03
20111202 machine learning_nikolenko_lecture0320111202 machine learning_nikolenko_lecture03
20111202 machine learning_nikolenko_lecture03
 
20070930 efficientalgorithms kulikov_lecture02
20070930 efficientalgorithms kulikov_lecture0220070930 efficientalgorithms kulikov_lecture02
20070930 efficientalgorithms kulikov_lecture02
 
9 1.1 - системы счисления
9 1.1 - системы счисления9 1.1 - системы счисления
9 1.1 - системы счисления
 
Системы счисления
Системы счисленияСистемы счисления
Системы счисления
 
Метод конечных разностей
Метод конечных разностейМетод конечных разностей
Метод конечных разностей
 
Лекция №9 "Алгоритмические композиции. Начало"
Лекция №9 "Алгоритмические композиции. Начало"Лекция №9 "Алгоритмические композиции. Начало"
Лекция №9 "Алгоритмические композиции. Начало"
 
презентация T
презентация Tпрезентация T
презентация T
 
L3: Линейная и логистическая регрессия
L3: Линейная и логистическая регрессияL3: Линейная и логистическая регрессия
L3: Линейная и логистическая регрессия
 

Similar to Analysis day1 - 2016

20111106 circuit complexity_seminar_lecture06_golovnev
20111106 circuit complexity_seminar_lecture06_golovnev20111106 circuit complexity_seminar_lecture06_golovnev
20111106 circuit complexity_seminar_lecture06_golovnev
Computer Science Club
 
распознавание автомобильного номера в условиях зашумлённости»
распознавание автомобильного номера в условиях зашумлённости»распознавание автомобильного номера в условиях зашумлённости»
распознавание автомобильного номера в условиях зашумлённости»
seik0ixtem
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
Alex Tumanoff
 
TMPA-2013 Dmitry Zaitsev
TMPA-2013 Dmitry ZaitsevTMPA-2013 Dmitry Zaitsev
TMPA-2013 Dmitry Zaitsev
Iosif Itkin
 
20091025 algorithmsfornphardproblems kulikov_lecture03
20091025 algorithmsfornphardproblems kulikov_lecture0320091025 algorithmsfornphardproblems kulikov_lecture03
20091025 algorithmsfornphardproblems kulikov_lecture03
Computer Science Club
 
20130302 np algorithms_kulikov_lecture04-05_sat
20130302 np algorithms_kulikov_lecture04-05_sat20130302 np algorithms_kulikov_lecture04-05_sat
20130302 np algorithms_kulikov_lecture04-05_sat
Computer Science Club
 
Задворный б.в. (минск) от идеи к исследованию
Задворный б.в. (минск)   от идеи к исследованиюЗадворный б.в. (минск)   от идеи к исследованию
Задворный б.в. (минск) от идеи к исследованию
Лёха Гусев
 
Задворный б.в. (минск) от идеи к исследованию
Задворный б.в. (минск)   от идеи к исследованиюЗадворный б.в. (минск)   от идеи к исследованию
Задворный б.в. (минск) от идеи к исследованию
Лёха Гусев
 
9. java lecture library
9. java lecture library9. java lecture library
9. java lecture library
MERA_school
 

Similar to Analysis day1 - 2016 (18)

Презентация "О распознавании образов в искусственном интеллекте"
Презентация "О распознавании образов в искусственном интеллекте"Презентация "О распознавании образов в искусственном интеллекте"
Презентация "О распознавании образов в искусственном интеллекте"
 
20111106 circuit complexity_seminar_lecture06_golovnev
20111106 circuit complexity_seminar_lecture06_golovnev20111106 circuit complexity_seminar_lecture06_golovnev
20111106 circuit complexity_seminar_lecture06_golovnev
 
9 ср1
9 ср19 ср1
9 ср1
 
Методы машинного обучения в физике элементарных частиц
Методы машинного обучения в физике элементарных частицМетоды машинного обучения в физике элементарных частиц
Методы машинного обучения в физике элементарных частиц
 
распознавание автомобильного номера в условиях зашумлённости»
распознавание автомобильного номера в условиях зашумлённости»распознавание автомобильного номера в условиях зашумлённости»
распознавание автомобильного номера в условиях зашумлённости»
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
TMPA-2013 Dmitry Zaitsev
TMPA-2013 Dmitry ZaitsevTMPA-2013 Dmitry Zaitsev
TMPA-2013 Dmitry Zaitsev
 
9893
98939893
9893
 
20091025 algorithmsfornphardproblems kulikov_lecture03
20091025 algorithmsfornphardproblems kulikov_lecture0320091025 algorithmsfornphardproblems kulikov_lecture03
20091025 algorithmsfornphardproblems kulikov_lecture03
 
20130302 np algorithms_kulikov_lecture04-05_sat
20130302 np algorithms_kulikov_lecture04-05_sat20130302 np algorithms_kulikov_lecture04-05_sat
20130302 np algorithms_kulikov_lecture04-05_sat
 
Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)
 
L5: Л5 Байесовские алгоритмы
L5: Л5 Байесовские алгоритмыL5: Л5 Байесовские алгоритмы
L5: Л5 Байесовские алгоритмы
 
Задворный б.в. (минск) от идеи к исследованию
Задворный б.в. (минск)   от идеи к исследованиюЗадворный б.в. (минск)   от идеи к исследованию
Задворный б.в. (минск) от идеи к исследованию
 
Задворный б.в. (минск) от идеи к исследованию
Задворный б.в. (минск)   от идеи к исследованиюЗадворный б.в. (минск)   от идеи к исследованию
Задворный б.в. (минск) от идеи к исследованию
 
Java.fundamentals
Java.fundamentalsJava.fundamentals
Java.fundamentals
 
Java.fundamentals
Java.fundamentalsJava.fundamentals
Java.fundamentals
 
word2vec (part 1)
word2vec (part 1)word2vec (part 1)
word2vec (part 1)
 
9. java lecture library
9. java lecture library9. java lecture library
9. java lecture library
 

More from Олег Стрекаловский

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

More from Олег Стрекаловский (6)

Analysis day2
Analysis day2Analysis day2
Analysis day2
 
Защита моей ВКР.
Защита моей ВКР.Защита моей ВКР.
Защита моей ВКР.
 
Когда код «убивает», или зачем нам тестировать наши продукты
Когда код «убивает», или зачем  нам тестировать наши продуктыКогда код «убивает», или зачем  нам тестировать наши продукты
Когда код «убивает», или зачем нам тестировать наши продукты
 
Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...
 
"Тёмная и Светлая сторона убеждения людей"
"Тёмная и Светлая сторона убеждения людей""Тёмная и Светлая сторона убеждения людей"
"Тёмная и Светлая сторона убеждения людей"
 
Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...
 

Analysis day1 - 2016

  • 1. Всероссийская олимпиада школьников по информатике Региональный этап, I тур Разбор задач Андрианов И. А. Стрекаловский О. А. Вологодский государственный университет Факультет прикладной математики, компьютерных технологий и физики Вологда 2016 г. 1/41 Всероссийская олимпиада школьников по информатике
  • 2. «Призы» Основная идея Классический алгоритм поиска второго максимума в массиве. 2/41 Всероссийская олимпиада школьников по информатике
  • 3. «Призы» Будем поддерживать две переменные: текущий максимум в массиве и второй по величине элемент. Тогда при добавлении в рассмотрение очередного приза обновим при необходимости первый и второй максимум. 3/41 Всероссийская олимпиада школьников по информатике
  • 4. «Призы» 1 int n = readInt (); 2 int a = readInt (); 3 int b = readInt (); 4 int max = max(a, b); 5 int secondMax = min(a, b); 6 print(secondMax + "␣"); 7 for (int i = 3; i <= n; i++) { 8 int num = readInt (); 9 if (num > max) { 10 print(max + "␣"); 11 secondMax = max; 12 max = num; 13 } else if (secondMax < num) { 14 print(num + "␣"); 15 secondMax = num; 16 } else { 17 print(secondMax + "␣"); 18 } 19 } 4/41 Всероссийская олимпиада школьников по информатике
  • 5. «Призы» Решение на С++ с multiset: 1 int n; 2 std::cin >> n; 3 std:: multiset <int > ma; 4 int x, y; 5 std::cin >> x >> y; 6 ma.insert(x); 7 ma.insert(y); 8 std:: cout << *ma.begin () << "␣"; 9 for (int i = 3; i <= n; i++) { 10 std::cin >> x; 11 ma.insert(x); 12 ma.erase(ma.begin ()); 13 std:: cout << *ma.begin () << "␣"; 14 } 5/41 Всероссийская олимпиада школьников по информатике
  • 6. «Призы» Типичные ошибки Неэффективное решение. Много проходов по исходным данным в поисках второго максимума. Второй максимум — это не всегда предыдущий максимум, увиденный при проходе по массиву. Тест: 1 3 2. 6/41 Всероссийская олимпиада школьников по информатике
  • 7. Вопросы по задаче? 7/41 Всероссийская олимпиада школьников по информатике
  • 8. «Космическое поселение» Основные идеи Перебор двух вариантов ориентации модулей. Двоичный поиск по величине толщины защиты жилого отсека при фиксированной ориентации модулей. Контроль переполнения 64-x разрядного типа данных. 8/41 Всероссийская олимпиада школьников по информатике
  • 9. «Космическое поселение» Пусть модуль ориентирован так, что сторона длиной a ориентирована вдоль стороны поля длиной w. Тогда после установки защиты толщиной d вдоль этой стороны можно установить ⌊w/(a + 2d)⌋ модулей. Аналогично, вдоль другой стороны можно установить ⌊h/(b + 2d)⌋ модулей. Всего можно установить (⌊w/(a + 2d)⌋) × (⌊h/(b + 2d)⌋) модулей. 9/41 Всероссийская олимпиада школьников по информатике
  • 10. «Космическое поселение» Пример решения без переполнения 64–x разрядного типа 1 long long L = 0; 2 long long R = min( (w - a) / 2, (h - b) / 2) + 1; 3 while (L + 1 < R) { 4 long long M = (L + R) / 2; 5 long long ad = a + 2 * M; 6 long long bd = b + 2 * M; 7 long long ac = w / ad; 8 long long bc = h / bd; 9 if (ac * bc >= n) { 10 L = M; 11 } else { 12 R = M; 13 } 14 } 15 return L; «А. C. Станкевич. Лекция 2: Сортировка и поиск».1 1 http://www.youtube.com/watch?v=qkLLcdgJj_o 10/41 Всероссийская олимпиада школьников по информатике
  • 11. «Космическое поселение» Типичные ошибки Неэффективное решение. Слишком большой перебор величины защиты. Переполнение 64-x разрядного типа данных при выборе слишком большой правой границы поиска или при промежуточных операциях. 11/41 Всероссийская олимпиада школьников по информатике
  • 12. «Космическое поселение» Типичные ошибки Неэффективное решение. Слишком большой перебор величины защиты. Переполнение 64-x разрядного типа данных при выборе слишком большой правой границы поиска или при промежуточных операциях. Решение на Java В Java 8 появились методы: Math.addExact(long x, long y) Math.multiplyExact(long x, long y) Кидают ArithmeticException в случае переполнения при выполнении операции. 11/41 Всероссийская олимпиада школьников по информатике
  • 13. Вопросы по задаче? 12/41 Всероссийская олимпиада школьников по информатике
  • 14. «Странные строки» Строка z является странной, если для нее выполняются следующие свойства: z содержит не более двух различных символов; все одинаковые символы в z идут подряд. 13/41 Всероссийская олимпиада школьников по информатике
  • 15. «Странные строки» Строка z является странной, если для нее выполняются следующие свойства: z содержит не более двух различных символов; все одинаковые символы в z идут подряд. Таким образом, для определения странности строки требуется найти количество ее подстрок, которые имеют такую структуру. Сделаем это в два этапа. 13/41 Всероссийская олимпиада школьников по информатике
  • 16. «Странные строки» Этап 1. Подстроки из повторяющихся символов Если в строке длиной N встречается только один символ, то её странность равна N. 14/41 Всероссийская олимпиада школьников по информатике
  • 17. «Странные строки» Этап 1. Подстроки из повторяющихся символов Пусть в строке встречаются подстроки из одного и того же символа. 15/41 Всероссийская олимпиада школьников по информатике
  • 18. «Странные строки» Этап 1. Подстроки из повторяющихся символов Пусть в строке встречаются подстроки из одного и того же символа. Пусть таких подстрок K и их размеры L1, L2, . . . , LK. 15/41 Всероссийская олимпиада школьников по информатике
  • 19. «Странные строки» Этап 1. Подстроки из повторяющихся символов Пусть в строке встречаются подстроки из одного и того же символа. Пусть таких подстрок K и их размеры L1, L2, . . . , LK. Тогда каждый такой символ добавляет к странности исходной строки max Li, где 1 ≤ i ≤ K. Пример: . . . aaaa 4 . . . aa 2 . . . Подстроки «aaaa» и «aa» являются странными. Из них можно выделить подстроки, которые являются подстроками исходной строки: «a», «aa», «aaa», «aaaa». В итоге символ «a» создаёт 4 подстроки и добавляет 4 к общей странности строки. 15/41 Всероссийская олимпиада школьников по информатике
  • 20. «Странные строки» Этап 2. Подстроки из двух разных символов Будем решать задачу независимо для каждой упорядоченной пары (a, b) символов. 16/41 Всероссийская олимпиада школьников по информатике
  • 21. «Странные строки» Этап 2. Подстроки из двух разных символов Будем решать задачу независимо для каждой упорядоченной пары (a, b) символов. Пусть в строке есть подстроки вида X aa . . . a ki bb . . . b li Y , где множество X — любой символ = a (или начало строки), а Y — любой символ = b (или конец строки). 16/41 Всероссийская олимпиада школьников по информатике
  • 22. «Странные строки» Этап 2. Подстроки из двух разных символов Будем решать задачу независимо для каждой упорядоченной пары (a, b) символов. Пусть в строке есть подстроки вида X aa . . . a ki bb . . . b li Y , где множество X — любой символ = a (или начало строки), а Y — любой символ = b (или конец строки). Поместим все пары (ki, li) в массив. 16/41 Всероссийская олимпиада школьников по информатике
  • 23. «Странные строки» Этап 2. Подстроки из двух разных символов Будем решать задачу независимо для каждой упорядоченной пары (a, b) символов. Пусть в строке есть подстроки вида X aa . . . a ki bb . . . b li Y , где множество X — любой символ = a (или начало строки), а Y — любой символ = b (или конец строки). Поместим все пары (ki, li) в массив. Теперь нам надо найти число пар (k, l), таких, что найдется (ki, li), такая что 1 ≤ k ≤ ki и 1 ≤ l ≤ li. 16/41 Всероссийская олимпиада школьников по информатике
  • 24. «Странные строки» Этап 2. Подстроки из двух разных символов Для поиска числа таких пар отсортируем все пары по ki, а затем по li. 17/41 Всероссийская олимпиада школьников по информатике
  • 25. «Странные строки» Этап 2. Подстроки из двух разных символов Для поиска числа таких пар отсортируем все пары по ki, а затем по li. Для каждой пары (ki, li) заменим li на максимум lj, где kj ≥ ki. 17/41 Всероссийская олимпиада школьников по информатике
  • 26. «Странные строки» Этап 2. Подстроки из двух разных символов Для поиска числа таких пар отсортируем все пары по ki, а затем по li. Для каждой пары (ki, li) заменим li на максимум lj, где kj ≥ ki. Теперь оставим по одной паре с каждым ki и просуммируем величины (ki − ki−1) × li для всех i. 17/41 Всероссийская олимпиада школьников по информатике
  • 27. «Странные строки» Этап 2. Подстроки из двух разных символов Для поиска числа таких пар отсортируем все пары по ki, а затем по li. Для каждой пары (ki, li) заменим li на максимум lj, где kj ≥ ki. Теперь оставим по одной паре с каждым ki и просуммируем величины (ki − ki−1) × li для всех i. Получившееся значение добавим к ответу на задачу. 17/41 Всероссийская олимпиада школьников по информатике
  • 28. «Странные строки» Это алгоритм поиска площади объединения прямоугольников с осями, параллельными осям координат, общим углом в (0, 0) и положительными координатами противоположного угла. 18/41 Всероссийская олимпиада школьников по информатике
  • 29. «Странные строки» Типичные ошибки Неэффективное решение. Проверка подстрок на странность «в лоб». Неэффективное удаление дубликатов с помощью вставки строк в структуру данных «множество». 19/41 Всероссийская олимпиада школьников по информатике
  • 30. Вопросы по задаче? 20/41 Всероссийская олимпиада школьников по информатике
  • 31. «Поездка на каникулах» Жадный алгоритм, дающий наименьшее число пересадок: Покупаем билет до станции назначения, если это возможно, иначе покупаем билет до самой дальней возможной станции. Для этой станции действуем аналогично, и т.д. Пояснение: незачем заранее пересаживаться на другое место, пока свободно прежнее 21/41 Всероссийская олимпиада школьников по информатике
  • 32. «Поездка на каникулах» 1 Пусть go1[i] — максимальный номер станции, до которой можно доехать от станции i, используя ровно 1 билет. 2 Допустим, массив go1 каким–то образом построен, и нужно проехать от f до s. 3 Тогда билеты надо покупать на станциях f, go1[f], go1[go1[f]] и т.д. 4 Обработка одного варианта поездки при этом выполняется за O(N) — то есть при условии эффективного построения массива go1 решаем первые две подзадачи. 22/41 Всероссийская олимпиада школьников по информатике
  • 33. «Поездка на каникулах» Построение массива go1 Наивное построение — квадратичная или более высокая вычислительная сложность. Позволяет решить лишь подзадачу 1. Более эффективное построение: Будем говорить, что место a свободно на протяжении отрезка [c, d], если никакой из проданных билетов не занимает это место между станциями c и d. 23/41 Всероссийская олимпиада школьников по информатике
  • 34. «Поездка на каникулах» Построение массива go1. Шаг №1 Построим все максимальные свободные отрезки для каждого места: 1 Вначале для каждого места имеется один свободный отрезок — от 1 до n. 2 Отсортируем все билеты с данным местом по станции отправления. 3 Будем рассматривать билеты в этом порядке (удобно представлять, что их в таком порядке покупали). 4 Каждый следующий билет вырезает кусок из последнего отрезка, расщепляя его на два. 24/41 Всероссийская олимпиада школьников по информатике
  • 35. «Поездка на каникулах» Построение массива go1. Шаг №1 Пример Пусть N = 10, рассматриваем место №1. 1 Вначале место №1 свободно на всём пути – один отрезок [1, 10]. 2 Куплен билет от 2 до 5 — стало 2 отрезка: [1, 2], [5, 10]. 3 Куплен билет от 8 до 9 — стало 3 отрезка: [1, 2], [5, 8], [9, 10]. 4 ... 25/41 Всероссийская олимпиада школьников по информатике
  • 36. «Поездка на каникулах» Пример реализации шага №1 1 std:: sort(tickets.begin (), tickets.end ()); 2 std::vector <std::vector <Range > > r(nPlaces); 3 for (int i = 0; i < nPlaces; i++) { 4 r[i]. push_back(Range (0, n - 1)); 5 } 6 for (Ticket &t : tickets) { 7 r[t.place ]. back ().to = t.from; 8 if (t.to != n - 1) { 9 r[t.place ]. push_back(Range(t.to , n - 1)); 10 } 11 } 26/41 Всероссийская олимпиада школьников по информатике
  • 37. «Поездка на каникулах» Построение массива go1. Шаг №2 Объединим множества свободных отрезков всех мест и отсортируем их по начальной станции. Пример Пусть у нас есть два места: место №1 — отрезки [1, 4], [6, 8]; место №2 — отрезки [1, 7], [8, 9]; Результат объединения и сортировки массива отрезков: [1, 7], [1, 4], [6, 8], [8, 9]. 27/41 Всероссийская олимпиада школьников по информатике
  • 38. «Поездка на каникулах» Пример реализации шага №2 1 std::vector <Range > ranges; 2 for (int i = 0; i < nPlaces; i++) { 3 std:: copy( 4 r[i]. begin (), 5 r[i].end (), 6 back_inserter(ranges) 7 ); 8 } 9 std:: sort(ranges.begin (), ranges.end ()); 28/41 Всероссийская олимпиада школьников по информатике
  • 39. «Поездка на каникулах» Построение массива go1. Шаг №3 Построим все максимальные свободные отрезки для каждого места: 1 Проходим по всем станциям и одновременно по полученному массиву отрезков, при этом храним и обновляем самый правый конец отрезка, который у нас встречался. 2 На каждом шаге записываем это значение в массив go1 (но только если оно больше текущей станции). 29/41 Всероссийская олимпиада школьников по информатике
  • 40. «Поездка на каникулах» Построение массива go1. Шаг №3 Пример Полученный ранее массив отрезков: [1, 7], [1, 4], [6, 8], [8, 9]. Станция №1. В массиве проходим по двум первым элементам, на третьем остановились. Самый правый конец = 7, то есть go1[1] = 7. Станция №2. В массиве остаёмся на том же месте. Самый правый конец всё еще 7, то есть go1[2]=7. По аналогии go1[3] = go1[4] = go1[5] = 7 Станция №6. В массиве проходим по следующим двум элементам, самый правый конец = 9. Отсюда go1[6]=9. По аналогии go1[7] =9, go1[8]=9. Поскольку самый правый конец = 9 — не больше номера станции, то go1[9] = 0. Аналогично, go1[10]=0. 30/41 Всероссийская олимпиада школьников по информатике
  • 41. «Поездка на каникулах» Пример реализации шага №3 1 std::vector <int > go1(n); 2 int rightmost = 0, range = 0; 3 for (int i = 0; i < n; i++) { 4 while (range < (int)ranges.size () 5 && ranges[range ]. from == i) { 6 rightmost = std::max( 7 rightmost , ranges[range ].to); 8 range ++; 9 } 10 if (rightmost > i) { 11 go1[i] = rightmost; 12 } 13 } Обратите внимание на сходство с алгоритмом вычисления z-функции для строк 31/41 Всероссийская олимпиада школьников по информатике
  • 42. «Поездка на каникулах» Альтернативный вариант реализации шага №3. Построение массива go1 Будем поддерживать множество «открытых» свободных отрезков, которые начинаются не позже рассматриваемой станции, в структуре данных, которая позволяет искать максимум по ключу (например, двоичная куча, дерево отрезков или std::set). В качестве ключа используем конец отрезка. 1 Рассматривая очередную станцию i, добавим все свободные отрезки, которые в ней начинаются, в множество открытых отрезков. 2 Теперь go1[i] равно максимальному концу открытого отрезка, либо i, если множество открытых отрезков пусто, или все они заканчиваются до i. 32/41 Всероссийская олимпиада школьников по информатике
  • 43. «Поездка на каникулах» Подзадача №3 Нужно на каждый запрос отвечать быстрее, чем за O(n). Варианты: Sqrt–декомпозиция — O( (n)); Метод двоичных подъёмов — O(log(n)); 33/41 Всероссийская олимпиада школьников по информатике
  • 44. «Поездка на каникулах» Решение подзадачи №3 методом sqrt–декомпозиции 1 Для каждой станции i делаем (n) прыжков по массиву go1 (то есть i → go1(i) → go1(go1(i)) → . . . ) и запоминаем, где мы оказались. 2 Пусть skip[i] — станция, в которую мы попадём, если сделать (n) прыжков по массиву go1. 34/41 Всероссийская олимпиада школьников по информатике
  • 45. «Поездка на каникулах» Решение подзадачи №3 методом sqrt–декомпозиции Теперь мы умеем делать не только малые прыжки длиной 1, но и большие прыжки длиной (n). Ответ на очередной запрос ищется так: 1 Вначале совершаем большие прыжки, пока это возможно и пока не выйдем за конечную станцию. 2 Возвращаемся к предыдущему шагу и совершаем малые прыжки, пока не придём в конечную станцию или станцию после неё. (200000) ≈ 450 Максимальное количество действий порядка 2 × 200000 × 450 = 180 миллионов 35/41 Всероссийская олимпиада школьников по информатике
  • 46. «Поездка на каникулах» Пример заполнения массива skip и поиска ответа на запрос 1 int SKIP = sqrt(n); 2 std::vector <int > skip(n); 3 for (int i = 0; i + SKIP < n; i++) { 4 int j = i, k; 5 for (k = 0; k < SKIP && go1[j] > 0; k++) 6 j = go1[j]; 7 if (k == SKIP) 8 skip[i] = j; 9 } 10 // поиск ответа 11 while (go1[from] < to) { 12 if (skip[from] > 0 && skip[from] < to) { 13 answer += SKIP; 14 from = skip[from ]; 15 } else { 16 answer ++; 17 from = go1[from ]; 18 } 19 } 36/41 Всероссийская олимпиада школьников по информатике
  • 47. «Поездка на каникулах» Решение подзадачи №3 методом двоичных подъемов Пусть go[i][j] равна максимальному номеру станции, до которого можно доехать от станции j, используя не более 2i билетов. Алгоритм построения матрицы go основан на следующей идее: 1 Пусть можно от j доехать максимум до u, используя не более 2i−1 билетов. 2 Пусть от u можно доехать максимум до v, используя не более 2i−1 билетов. 3 Тогда от j можно доехать до v, используя не более 2i билетов. 37/41 Всероссийская олимпиада школьников по информатике
  • 48. «Поездка на каникулах» Пример заполнения массива go 1 for (int i = 1; i <= sz; i++) { 2 for (int j = 0; j < n; j++) { 3 int u = go[i - 1][j]; 4 go[i][j] = go[i - 1][u]; 5 } 6 } В качестве sz следует выбрать минимальную величину, такую что 2sz ≥ n. 38/41 Всероссийская олимпиада школьников по информатике
  • 49. «Поездка на каникулах» Поиск ответа на запрос с помощью метода двоичных подъемов Запрос на поездку от fr до to 1 if (go[sz][fr] < to) { 2 cout << -1 << endl; 3 } else { 4 int steps = 0; 5 int curK = sz; 6 while (go1[fr] < to) { 7 while (go[curK ][fr] >= to) { 8 curK --; 9 } 10 steps += 1 << curK; 11 fr = go[curK ][fr]; 12 } 13 cout << steps + 1 << endl; 14 } 39/41 Всероссийская олимпиада школьников по информатике
  • 50. Вопросы по задаче? 40/41 Всероссийская олимпиада школьников по информатике
  • 51. Заключение Спасибо за внимание! 41/41 Всероссийская олимпиада школьников по информатике