Блог пользователя vaaven

Автор vaaven, 14 месяцев назад, По-русски

1802A - Лайки

Автор: Aleks5d, разработчик: vaaven

Решение
Код

1802B - Расселение морских свинок

Автор и разработчик: Aleks5d

Решение
Код

1801A - Очень красивое одеяло

Автор и разработчик: 4qqqq

Решение
Код

1801B - Покупка подарков

Автор: Tikhon228, Разработчик: DishonoredRighteous

Решение
Код

1801C - Музыкальный фестиваль

Автор: vaaven, Разработчик: ViktorSM

Решение
Код

1801D - Путь домой

Автор: Tikhon228, Разработчик: Ormlis

Решение
Код

1801E - Цены на бензин

Автор и разработчик: Kirill22

Решение
Код

1801F - Ещё одна n-мерная шоколадка

Автор и разработчик: Tikhon228

Решение
Код

1801G - Задачечка на подстрочечки

Автор и разработчик: grphil

Решение
Код

Полный текст и комментарии »

Разбор задач Codeforces Round 857 (Div. 1)
Разбор задач Codeforces Round 857 (Div. 2)
  • Проголосовать: нравится
  • +125
  • Проголосовать: не нравится

Автор vaaven, 15 месяцев назад, По-русски

1793A - Ещё одна акция придумал и подготовил Ormlis

1793B - Федя и массив придумал и подготовил TheEvilBird

1793C - Даша и поиски придумал fedoseev.timofey, а подготовил vaaven

1793D - Московские гориллы придумал и подготовил Gornak40

1793E - Велепин и маркетинг придумал и подготовил Tikhon228

1793F - Ребрендинг придумал Tikhon228, а подготовил vaaven

1793A - Ещё одна акция

Пусть $$$n = (m + 1) \cdot q + r$$$.

Заметим, что акцией выгодно пользоваться если $$$a \cdot m \leq b \cdot (m + 1)$$$. В таком случае $$$q$$$ раз купим картошку по акции. Оставшуюся картошку (или всю, если акция не выгодна) можно купить по цене $$$\min(a, b)$$$ за килограмм.

Тогда ответ:

$$$q \cdot \min(a \cdot m, b \cdot (m + 1)) + r \cdot \min(a, b)$$$

Асимптотика решения: $$$\mathcal{O}(1)$$$

Code

1793B - Федя и массив

Заметим, что локальные минимумы и максимумы будут чередоваться, и их будет одинаковое количество $$$k$$$. Обозначим $$$i$$$-й локальный максимумум за $$$a_i$$$, $$$i$$$-й локальный минимум за $$$b_i$$$. Без потери общности считаем, что $$$a_i$$$ идет раньше $$$b_i$$$. Чтобы перейти от $$$a_i$$$ к $$$b_i$$$ надо выписать $$$a_i - b_i$$$ чисел, от $$$b_i$$$ к $$$a_{(i + 1) \bmod k}$$$ надо $$$a_{(i + 1) \bmod k} - b_i$$$.

Тогда $$$(a_1 - b_1) + (a_2 - b_1) + (a_2 - b_2) + \ldots + (a_k - b_k) + (a_1 - b_k) $$$

$$$= 2 \cdot (a_1 + a_2 + \ldots + a_k) - 2 \cdot (b_1 + b_2 + \ldots + b_k) = 2 \cdot (A - B) = n$$$

В качестве массива подойдет $$$[y, y + 1, y + 2, \ldots, x - 1, x, x - 1, x - 2, \ldots, y + 1]$$$.

Code

1793C - Даша и поиски

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

Из факта выше следует алгоритм: давайте посмотрим на подотрезок $$$[l; r]$$$, который изначально равен $$$[1; n]$$$. Если $$$a_l = \min(a_{l}, a_{l+1}, \ldots, a_{r})$$$ или $$$a_l = \max(a_l, a_{l + 1}, \ldots, a_r)$$$, то перейдем к отрезку $$$[l + 1; r]$$$. Также необходимо аналогичное рассуждения для $$$a_r$$$. Таким образом мы либо через сколько-то иттераций получим требуемый подотрезок, либо получим $$$l == r$$$ и ответом будет $$$-1$$$.

Итоговая ассимптотика: $$$\mathcal{O}(n\log n)$$$ или $$$\mathcal(O)(n)$$$ в зависимости от реализации.

Code

1793D - Московские гориллы

Обозначим за $$$pos_x$$$ индекс числа $$$x$$$ в перестановке. Подотрезки с $$$\operatorname{MEX}>1$$$ имеют вид $$$1 \le l \le pos_1 \le r \le n$$$.

Введем обозначения: $$$l_x = \min{[pos_1, pos_2, \ldots, pos_x]}$$$, $$$r_x = \max{[pos_1, pos_2, \ldots, pos_x]}$$$.

Подотрезки с $$$\operatorname{MEX}>x$$$ имеют вид $$$1 \le l \le l_x \le r_x \le r \le n$$$. Давайте определим вид подотрезков с $$$\operatorname{MEX}=x$$$.

Если $$$pos_{x + 1} < l_x$$$, тогда подотрезки с $$$\operatorname{MEX}=x+1$$$ имеют вид $$$pos_{x+1}<l \le l_x \le r_x \le r \le n$$$

Если $$$l_x \le pos_{x + 1} \le r_x$$$, тогда не существует подотрезка с $$$\operatorname{MEX}=x + 1$$$

Если $$$r_x < pos_{x+1}$$$, тогда подотрезки с $$$\operatorname{MEX}=x+1$$$ имеют вид $$$1 \le l \le l_x \le r_x \le r < pos_{x+1}$$$

Осталось всего лишь пересечь множества таких подотрезков для $$$p$$$ и $$$q$$$, что делается тривиально.

Code

1793E - Велепин и маркетинг

Давайте отсортируем людей по их требованию размера группы. Предположим у нас есть такой человек $$$i$$$, что он не доволен, и есть человек $$$j > i$$$, который доволен. Тогда мы можем заменить $$$j$$$ человека в его группе на $$$i$$$ и ответ для нас не ухудшится. Отсюда следует, что для конкретного $$$k$$$ ответ это какой-то префикс людей, которых мы можем сделать довольными.

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

Таким образом мы получили, что мы можем искать решение в виде разбиения каждого префикса на валидные группы, которые являются отрезками. Будем решать эту задачу с помощью динамического программирования.

Пусть $$$dp[i]$$$ -- максимальное количество групп, на которые можно разбить $$$i$$$-й префикс, так чтобы все были довольны (при чем нельзя использовать элементы за префиксом). База динамики: $$$dp[0] = 0$$$ (пустой префикс максимум можно разбить на 0 групп). Переход: для $$$i$$$-го человека его группа должна иметь размер хотя бы $$$a[i]$$$, поэтому переход выглядит следующим образом $$$dp[i] = \underset{0 \leqslant j \leqslant i - a[i]}{\max} dp[j] + 1$$$. Но что если $$$a[i] > i$$$? Тогда мы не можем набрать $$$i$$$-й префикс. Тогда положим $$$dp[i] = -\infty$$$. Эту динамику можно посчитать с помощью префиксных максимумов. Эта часть решения работает за $$$\mathcal{O}(n)$$$.

Ранее мы сказали, что ответом будет являться какой-то префикс людей, которые будут довольны. Если мы можем разбить префикс на какое-то количество групп, то этот ответ может являтся префиксом для всех $$$k \leqslant dp[i] + n - i$$$. (мы разбиваем наш префикс соотвественно $$$dp$$$, а остальных людей расскидываем по одному в группу)

Если мы не можем сделать весь префикс довольным ($$$dp[i] = -\infty$$$), то нам надо докидывать людей извне. Таким образом максимальное количество групп, на которые мы можем разбить, если $$$i$$$-й префикс полностью доволен, это $$$n - a[i] + 1$$$.

Заметим, что если каким-то префиксом мы можем набрать $$$k$$$, то тогда можем набрать и $$$k - 1$$$ (объединив две группы в одну). Тогда нам нужно найти самый большой префикс, который подходит для данного $$$k$$$ в запросе. Это можно сделать массивом суффиксных максимумом за $$$\mathcal{O}(q)$$$ суммарно. Итоговая асимптотика решения: $$$\mathcal{O}(n \log n + q)$$$.

Code

1793F - Ребрендинг

Давайте будем идти по всем элементам слева направо. Основной задачей будет поддержка актуальной версии $$$dp[i]$$$ -- минимальной разности $$$a_i$$$ с элементами справа от него, которые мы успели рассмотреть. Пусть мы корректно посчитали $$$dp$$$ для первых $$$r$$$ элементов. Перейдем к $$$r + 1$$$. Давайте покажем как обновить ответ для всех $$$j < i$$$, таких что $$$a[j] > a[i]$$$. Для $$$j < i$$$, таких что $$$a[j] < a[i]$$$ решается аналогично.

Давайте возьмем первый элемент $$$a[j]$$$ слева от $$$i$$$, такой что $$$a[j] > a[i]$$$. Заметим, что если есть $$$l < j < i$$$, такой что $$$a[l] > a[j] > a[i]$$$, то для него мы $$$dp[l]$$$ не будем обновлять, потому что $$$|a[l] - a[j]| < |a[l] - a[i]|$$$. Также мы не будем обновлять ответ для $$$l$$$ таких что $$$|a[l] - a[j]| < |a[l] - a[i]|$$$, то есть если $$$a[l] > a[i] + \frac{a[j] - a[i]}{2}$$$. Поэтому дальше нас будут интересовать только числа с отрезка $$$\left[ a[i], a[i] + \frac{a[j] - a[i]}{2}\right]$$$.

Давайте заметим, что мы уменьшили длину отрезка в $$$2$$$ раза. То есть таких иттераций будет не больше $$$\mathcal{O}(\log n)$$$. Находить самое правое число, принадлежащее отрезку, можно с помощью дерева отрезков. Ответом для отрезка $$$l_i, r_i$$$ будет $$$\underset{l_i \leqslant j < r}{\min} dp[l]$$$ в момент $$$r_i$$$. Это также можно эффективно находить с помощью дерева отрезков. Итоговая асимптотика решения $$$\mathcal{O}(n \log^2 n + q \log n)$$$.

Также есть решение за $$$\mathcal{O}(n\sqrt{n} + q \log q)$$$, которое проходит все тесты.

Code

Полный текст и комментарии »

Разбор задач Codeforces Round 852 (Div. 2)
  • Проголосовать: нравится
  • +130
  • Проголосовать: не нравится

Автор vaaven, история, 15 месяцев назад, По-русски

Всем привет!

В воскресенье пройдет Московская олимпиада школьников для 6-9 классов. Олимпиаду подготовила Московская методическая комиссия, известная вам также по Московской командной олимпиаде школьников по программированию, Открытой олимпиаде школьников по программированию и олимпиаде Мегаполисов (раунды 327, 342, 345, 376, 401, 433, 441, 466, 469, 507, 516, 541, 545, 567, 583, 594, 622, 626, 657, 680, 704, 707, 727, 751, 775, 802, 829).

Раунд состоится в Feb/12/2023 11:35 (Moscow time) и продлится 2 часа. Обратите внимание на нестандартное время начала раунда. Раунд будет проведён по правилам Codeforces и будет рейтинговым.

В связи с этим мы просим всех участников сообщества, участвующих в соревновании, проявить уважение к себе и другим участникам соревнования и не пытаться читерить никоим образом, в частности, выясняя задачи у участников соревнования. Если вы узнали какие-либо из задач МОШ (участвуя в ней лично, от кого-то из участников или каким-либо иным образом), пожалуйста, не пишите раунд. Участников олимпиады мы просим воздержаться от публичного обсуждения задач до окончания раунда. Любое нарушение правил выше будет являться поводом для дисквалификации.

Задачи соревнования были подготовлены Tikhon228, TheEvilBird, Ormlis, vaaven, Gornak40, Honey_Badger под руководством vaaven, grphil и Андреевой Елены Владимировны.

Спасибо Artyom123 за координацию раунда и помощь в подготовке задач, а так же MikeMirzayanov за системы Codeforces и Polygon, который использовался при подготовке задач этой олимпиады.

Спасибо BucketPotato, KseniaShk, NemanjaSo2005, MagentaCobra, kuertov, prvocislo, 4qqqq, vsinitsynav, FynjyBath, qualdoom, ivanlarin, didedoshka, petyb, PBBx0, Mikhango, charlyk, RP-1, talant, ak2006 за тестирование.

Заранее сообщаем, что из-за проведения официального соревнования исходные коды других участников будут недоступны ещё час после окончания раунда.

Всем удачи!

UPD: Разбалловка: 500 — 1000 — 1250 — 1750 — 2500 — 3250

UPD2: Разбор

Полный текст и комментарии »

  • Проголосовать: нравится
  • -493
  • Проголосовать: не нравится