Вы находитесь на странице: 1из 2

Подготовка к областной олимпиаде

Марафон - 2022

Задача I. Маша и большой массив


Ограничение по времени: 0.2 секунды
Ограничение по памяти: 64 мегабайта

Маша объявила в своей программе массив из 𝑁 + 2 элементов. Первому и последнему элементу массива
Маша присвоила значение 1, все остальные элементы равны 0. Далее Маша 𝐾 раз делает:

∙ находит в массиве самый большой участок состоящий из одних нулей, если таких участков несколько,
выбирает любой;
∙ если длина выбранного отрезка нечётна, то элементу, который находится строго посередине участка
присваивает значение 1;

∙ если длина выбранного отрезка чётна, то любому из двух «средних» элементов участка присваивает
значение 1.

Определите, сколько нулей будет слева и справа от единички, которую Маша запишет в массив на 𝐾-м
шаге алгоритма.

Формат входных данных


Программа получает на вход два целых числа 𝑁 и 𝐾, 1 6 𝐾 6 𝑁 6 1018 . Числа записаны во входных
данных по одному на строку, как в примерах.

Формат выходных данных


Ваша программа должна вывести два целых числа в порядке неубывания − количество нулей с двух
сторон от единички, которую Маша записала в массив на 𝐾 шаге алгоритма.

Примеры
тест ответ
10 4
1 5
10 2
2 2
10 1
3 2

Страница 18 из 34
Подготовка к областной олимпиаде
Марафон - 2022

Разбор задачи «Маша и большой массив»


Решение.

Для небольших 𝑁 можно было реализовать решение сложности 𝑂(𝑁 ·𝐾): в массиве, заполненном числами
0 или 1 будем отмечать, какие места свободны, а какие − заняты. Далее моделируется процесс выбора места:
в массиве находится самый длинный непрерывный участок из 0, и элемент посередине этого участка меняется
на 1. Приводить пример такого решения не будем.

Можно хранить не схему размещения всех свободных ячеек в массиве, а только множество непрерывных
участков из свободных мест. Например, если 𝑁 = 10, то в самом начале есть один свободный участок длины
10. Маша записывает единицу в середину этого участка, поэтому вместо одного участка длины 10 в множество
добавляются участки длины 5 и 4. Далее участок длиной 5, разбивается на два участка длиной 2 и 2 и т. д.
На каждом шаге из множества выбирается самый большой элемент и вместо него в множество добавляется
два меньших элемента. При этом необходимо уметь быстро находить в множестве наибольший элемент и
добавлять в множество новые элементы, для этого можно использовать структуру данных multiset языка
C++. Такое решение будет иметь сложность 𝑂(𝐾 · 𝑙𝑜𝑔𝐾) и набирает примерно 60 баллов:
1 long long pop ( multiset < long long > & s ) {
2 auto it = s . end () ; -- it ;
3 int ans = * it ; s . erase ( it ) ;
4 return ans ;
5 }
6 int main () {
7 long long n , k , ans1 , ans2 ;
8 cin >> n >> k ;
9 multiset < long long > s ;
10 s . insert ( n ) ;
11 for ( long long i = 0; i < k ; ++ i ) {
12 n = pop ( s ) ;
13 ans1 = ( n - 1) / 2; ans2 = n - 1 - ans1 ;
14 s . insert ( ans1 ) ; s . insert ( ans2 ) ;
15 }
16 cout << ans1 << endl << ans2 << endl ;
17 }

Для полного решения на 100 баллов заметим, что после выполнения большого числа операций множество
свободных участков будет содержать большое число одинаковых значений, так как если два участка оди-
наковой длины поделить на части, то результат тоже будет одинаковой длины. Поэтому в множестве длин
участков можно хранить не все участки равной длины, а для каждой имеющейся длины участка запоми-
нать, сколько существует в настоящий момент участков такой длины. Тогда все участки равной длины будут
обрабатываться не по одному, а все вместе.

В приведенном ниже решении используется словарь (ассоциативный массив) d, у которого ключ − это
длина участка, а значение − количество участков заданной длины. Инициализация массива: d[n] = 1, то
есть в самом начале есть один участок длины 𝑁 .
1 n = int ( input () )
2 k = int ( input () )
3 d = dict ()
4 d[n] = 1
5 while k > 0:
6 m = max ( d . keys () )
7 count = min (k , d [ m ])
8 del d [ m ]
9 k -= count
10 ans1 = ( m - 1) // 2
11 ans2 = m - 1 - ans1
12 d [ ans1 ] = d . get ( ans1 , 0) + count
13 d [ ans2 ] = d . get ( ans2 , 0) + count
14 print ( ans1 )
15 print ( ans2 )

Страница 19 из 34

Вам также может понравиться