Разбор задач Educational Codeforces Round 9

Правка ru3, от Edvard, 2016-03-02 01:36:50

632A - Grandma Laura and Apples

Задача предложена пользователем unprost.

Рассмотрим на процесс с конца. Последний покупатель всегда покупает половину яблока и половину получает бесплатно (поэтому последняя строка на самом деле всегда равна halfplus). Далее каждый покупатель удваивает текущее количество яблок и возможно прибавляет к нему единицу. Таким образом, нам просто задано бинарное представление числа записанное с конца. Для подсчёта ответа нужно просто с конца восстанавливать количество яблок попутно, вычисляя сумму денег.

С++ solution by me

С++ solution by unprost

Сложность: O(p).

632B - Alice, Bob, Two Teams

Задача предложена пользователем Lewin Gan Lewin.

Посчитаем частичные суммы на префиксах отдельно для всех чисел (в массиве s1) и отдельно для чисел напротив, которых стоит буква B (в массиве s2). Теперь мы можем за O(1) вычислять сумму на любом подотрезке, а также сумму на любом отрезке по числам напротив буквы B.

Переберем теперь префикс или суффикс и посчитаем сумму в случае его изменения по формуле: sum(s1, 0, n - 1) + sum(s2, 0, i) - s·sum(s1, 0, i) для префикса и sum(s1, 0, n - 1) + sum(s2, i, n - 1) + 2·sum(s1, i, n - 1) для суффикса.

C++ solution by me.

Python solution by Lewin.

Сложность: O(n).

632C - The Smallest String Concatenation

Задача предложена пользователем Lewin Gan Lewin. Доказательство транзитивности также принадлежит ему.

Отсортируем все строки по компаратору a + b < b + a и сконкатенируем их в получившемся порядке. Докажем, что ответ оптимальный. Пусть эта операция транзитивна (то есть из ). Рассмотрим оптимальный ответ в котором есть пара строк, находящихся по этому отношению в обратном порядке. Поскольку это отношение транзитивно, то без потери общности можно считать, что это пара соседних строк. Но тогда мы их можем просто поменять местами и улучшить ответ.

Докажем транзитивность отношения. Будем смотреть на эти строки как на числа в 26-ной системе счисления. Тогда отношения a + b < b + a эквивалентно . Последнее есть просто отношение для действительных чисел. Таким образом, мы доказали транзитивность отношения a + b < b + a.

C++ solution by me.

Python solution by Lewin.

P.S.: Удивительно но в этой задаче решение на Python работает более чем в 5 раз быстрее решения на С++. Если кто-нибудь понимает почему, пожалуйста поделитесь очень интересно.

Сложность: O(nLlogn), где L — наибольшая длина строки.

Теги учебный раунд 9, разбор задач

История

 
 
 
 
Правки
 
 
  Rev. Язык Кто Когда Δ Комментарий
en7 Английский Edvard 2016-03-03 02:14:37 138
ru12 Русский Edvard 2016-03-03 02:04:28 140
ru11 Русский Edvard 2016-03-02 17:52:11 122
en6 Английский Edvard 2016-03-02 17:51:16 2062
en5 Английский Edvard 2016-03-02 17:29:46 963
en4 Английский Edvard 2016-03-02 17:17:52 1105
ru10 Русский Edvard 2016-03-02 17:05:02 180
en3 Английский Edvard 2016-03-02 17:03:47 748
en2 Английский Edvard 2016-03-02 16:58:00 686
ru9 Русский Edvard 2016-03-02 03:33:59 39
en1 Английский Edvard 2016-03-02 03:33:00 1838 Initial revision for English translation
ru8 Русский Edvard 2016-03-02 03:24:21 2035 Мелкая правка: '_2},\ldots\n,a_{k_m,j}' -
ru7 Русский Edvard 2016-03-02 02:55:42 4
ru6 Русский Edvard 2016-03-02 02:46:07 2299
ru5 Русский Edvard 2016-03-02 02:11:36 2
ru4 Русский Edvard 2016-03-02 02:08:48 870 Мелкая правка: 'руков [used:pitfall].' -
ru3 Русский Edvard 2016-03-02 01:36:50 1379 Мелкая правка: 'ость: $O(n logn l)$, где $l$ --- наиб' -
ru2 Русский Edvard 2016-03-02 01:14:49 776
ru1 Русский Edvard 2016-03-02 01:03:34 748 Первая редакция (опубликовано)