Всем Привет!

Меня зовут Максим и я очень давно хочу достичь рейтинга 3000. Я верю, что для этого мне надо научиться мыслить, как человек, у которого уже есть 3000 рейтинга. Очень часто в разборах пишут фразы "заметим, что..." или "докажем вот такой факт..." и дальше идет долгое доказательство этого факта. А то, каким образом я должен к этому факту прийти, как эта мысль должна зародиться у меня в голове, никто нигде не пишет. Я думаю, что не только у меня есть эта проблема, поэтому вместо того, чтобы ждать понятный разбор, я решил начать с себя. Именно поэтому, я решил написать пошаговый разбор, где я буду описывать ход своих мыслей и действий, которые позволяют мне придумать эти самые идеи.
Также, я создал группу по прокачке навыков спортивного программирования для людей с рейтингом 1200- , чтобы помочь им стать лучше и достигнуть рейтинга 1500+. Если хотите больше об этом узнать, рекомендую прочитать ЭТОТ ПОСТ или заполнить ФОРМУ. Эту группу я назвал Polaris в честь путеводной звезды. В Polaris ребята решают специально подобранные контесты под их уровень, дорешивают их с помощью пошаговых разборов, изучают новую теорию, решают специально подготовленные для них подводящие упражнения, а также получают подробные рекомендации на основе их участия в тренировочных контестах. Более того, специально для участников группы я делаю пошаговые разборы тех задач, которые интересны самим участникам. Также, в группе регулярно ведется обсуждение прошедших контестов, а в ближайшем будущем мы будем готовиться к предстоящим олимпиадам (как школьным, так и студенческим). Присоединяйтесь, я буду вам очень рад!
А теперь перейдем к самому разбору контеста. Но перед этим, я бы хотел ввести несколько правил чтения разбора для того, чтобы вы смогли получить максимум пользы от него.
- Перед чтением разбора задачи, убедитесь, что вы прочитали задачу, подумали над ней, извлекли из своей головы и записали/нарисовали максимальное количество идей и больше уже ничего не можете придумать.
- Во время чтения разбора, если в какой-то момент, какое-то предложение в разборе навело вас на новую мысль, перестаньте читать разбор и вернитесь к пункту (1), а именно продолжите с этого места генерировать новые идеи. Это очень важно.
- Если вы дочитали текст разбора до конца и не поняли, как решать задачу или остались вопросы, то их нужно обязательно задать в комментариях или спросить в Polaris. Там вам помогут я и ребята, кто справился с этой задачей. Также в этом случае, полезно прочитать код, который будет прикреплен к разбору.
- После того, как вы решили задачу, обязательно посмотрите код других участников и код с разбора. Возможно, он наведет вас на мысль о том, как можно было проще и быстрее реализовать решение задачи.
A. Разрушение башен
Шаг 1Что написано в условии? Сказано, что мы можем взять левую башню и обрезать правую башню высотой первой, приечм мы можем это делать только с самой ближайшей справа башней, которая больше левой. А можно ли любую башню справа обрезать, а не только самую ближайшую.
Шаг 2Можно. Мы можем много раз подряд выбирать башню $$$i$$$, тогда с ее помощью можно обрезать все башни правее нее. Тогда какую минимальную высоту можно получить в башне $$$i$$$?
Шаг 3В башне $$$i$$$ мы можем получить высоту $$$\min(a_1,a_2,\ldots,a_i)$$$, но никак не меньше. Тогда чему равен ответ?
Шаг 4Пусть $$$A_i$$$ — префиксный минимум, тогда ответ $$$\sum_i A_i$$$
Решение: 379806776
B. Раздражительный призрак
Шаг 1Что происходит в задаче? Мы сначала перемешиваем массив $$$b$$$, а потом пытаемся превратить его в $$$a$$$ с помощью добавления неотрицательных чисел. Тогда какой критерий можно сформулировать для массива $$$b$$$ после перемешивание, что его можно превратить в $$$a$$$?
Шаг 2Массив $$$b$$$ можно превратить в $$$a$$$ тогда и только тогда, когда $$$b_i \le a_i$$$ для всех $$$i$$$. Тогда посмотрим на исходный массив $$$b$$$, посмотрим на какой-то элемент $$$b_i$$$, на каких позициях он может стоят в финальном ответе?
Шаг 3Найдем для него минимальный $$$j$$$, что $$$b_i \le a_j$$$, тогда мы можем положить $$$b_i$$$ в любую позицию, начиная с $$$j$$$, то есть $$$(j,j+1,\ldots)$$$. Тогда какую простую стратегию можем придумать?
Шаг 4Можем идти слева направо и если встретили $$$b_i \gt a_i$$$, тогда для него можем найти миниальную позицию $$$j$$$, что $$$b_i \le a_j$$$ и подвинуть этот элемент туда. Ограничения позволяют решить задачу за $$$O(n^2)$$$. Почему это работает?
Шаг 5Во-первых, мы обязаны подвинуть элемент $$$b_i$$$ хотя бы в $$$j$$$, но с другой стороны не имеет смысл сейчас его двигать дальше, потому что мы сможем это сделать на следующих шагах, если потребуется.
Решение: 379807322
C. Излишек утят
Шаг 1В большинстве задач, можно попробовать решать их, идя слева направо, то есть попытаться решить задачу для префикса $$$a_1,a_2,\ldots,a_i$$$. В этой задаче стоит сделать именно так, потому что в итоге мы хотим получить отсортированный массив, значит максимум будут всегда справа. Как это сделать?
Шаг 2Пускай мы решили задачу для префикса $$$a_1,\ldots,a_{i-1}$$$. Мы хотим добавить $$$a_i$$$. Какие бывают случаи?
Шаг 3Если $$$a_{i-1} \le a_i$$$, то префикс уже отсортирован, а если $$$a_i \lt a_{i-1}$$$?
Шаг 4Тогда мы обязаны свапать $$$a_i$$$ с предыдущим элементом пока префикс не отсортирован. Что тогда будет происходить?
Шаг 5Тогда сам элемент $$$a_i$$$ не поменяется, но подвинется куда-то влево, а те элементы, с которыми мы поменяемся местами увеличиться на $$$a_i$$$. Отлично, научились решать задачу за $$$O(n^2)$$$, но можно ли быстрее? Нужно ли нам знать весь префикс?
Шаг 6Так как в итоге нам нужно узнать только последний элемент, то можем помнить только его, тогда если $$$a_{i-1} \le a_i$$$, то новый макс. элемент равен $$$a_i$$$, а иначе $$$a_{i-1}+a_i \ge a_{i-1}$$$.
Решение: 379808113
D. Стальной биточист
Шаг 1Какое самое простое условие должно выполняться, чтобы строка была красивой? В каких случаях мы точно не сможем сделать ни одной операции?
Шаг 2Строка точно не является красивой, если она содержит хотя бы два элемента, причем все элементы чередуются (например $$$01010101$$$), то есть нет одинаковых соседей.
Шаг 3Задача похожа на часто-встречающуюся задачу, когда два соседних элемента заменяют на их сумму. В такой задаче сумма массива никогда не меняется. Можно ли сделать в этой задаче что-то похожее?
Шаг 4Пусть $$$a$$$ — это число, на которое мы заменим нули, а $$$b$$$ — число, на которое мы заменим единицы. Тогда мы хотим, чтобы $$$a + a = b, b + b = a$$$, то есть $$$2a=b,2b=a$$$. Что тогда?
Шаг 5Тогда $$$a = 2\cdot b = 2\cdot (2\cdot a) = 4a$$$, то есть $$$3a = 0$$$. На что похоже?
Шаг 6Это похоже на арифметику по модулю $$$3$$$. Возьмем $$$a \equiv +1\pmod{3}, b \equiv -1 \pmod{3}$$$
Решение: 379812409