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

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

Надеемся, что вам понравились наши задачи!

1858A - Кнопки

Tutorial
Code

1858B - Прогулка по Aллее

Tutorial
Code

1858C - Очередная задача на перестановки

Tutorial
Code

1858D - Деревья и отрезки

Tutorial
Code

1858E2 - Откаты (сложная версия)

Tutorial
Code

Примечание: Примерно через 20 минут после начала раунда один из тестеров (SomethingNew) придумал линейное решение для задачи E2, а jiangly написал такое же решение после окончания раунда! Более подробно: 219001999. Основная идея этого решения (как jiangly отметил в комментариях) — это то, что мы можем использовать префиксные суммы вместо дерева Фенвика.

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

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

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

Привет, Codeforces!

Мы рады пригласить вас принять участие в Codeforces Round 893 (Div. 2), который состоится 15.08.2023 17:35 (Московское время).

Обратите, пожалуйста, внимание на необычное время начала раунда. Этот раунд будет рейтинговым для участников, чей рейтинг ниже 2100.

Наш раунд был полностью подготовлен учениками ЛКШ (Летней компьютерной школы). Мы постарались подготовить по-настоящему интересные и креативные задачи. Вы можете ознакомиться с некоторыми из предыдущих раундов, подготовленных учениками ЛКШ: Codeforces Round 816 (Div. 2), Codeforces Round 815 (Div. 2),Codeforces Round #694,Codeforces Round #612,Codeforces Round #530.

Авторы и разработчики задач: Дарья arbuzick Грекова, Петр green_gold_dog Лосев, Ярослав Kihihihi Семенюк, Артем ArtAlex Алексеев, Антон NToneE Егоров, Федор FedShat Шатохин, Тимофей IzhtskiyTimofey Ижицкий, Егор salyg1n Салыгин, Владимир plagues Герасиков под руководством Евгения pakhomovee Пахомова

Мы очень благодарны

У вас будет 5 задач и 2 часа на их решение. Мы рекомендуем вам прочитать все задачи. В раунде могут встретиться интерактивные задачи! Обязательно прочитайте этот пост.

Разбалловка: $$$500-1250-1500-2000-(1750+1000)$$$

Обратите внимание, раунд перенесен на 1 час. Время начала: 15.08.2023 17:35 (Московское время)

Мы надеемся, что вам понравятся подготовленные нами задачи!

Удачи!

UPD: Разбор

UPD 2: Поздравляем победителей!

Div. 2:

  1. dong_liu

  2. yydtq

  3. wk______tzc

  4. qwesda

  5. Van_Dijk

Div. 1:

  1. jiangly

  2. neal

  3. BucketPotato

  4. kotatsugame

  5. YocyCraft

First solves:

A. ball_of_wool

B. ecnerwala

C. nigus

D. jiangly

E1. grass8sheep

E2. yydtq

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

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

Автор pakhomovee, 4 года назад, По-русски

Кратко про алгоритм Мо

Задача 1
Задача 2

Рассмотрим задачу 1. Заметим, что её можно решить с помощью персистентных структур данных. Однако, поставим себе цель решить задачу 2. Да и с персистентностью бывают проблемы.

Алгоритм 1

Будем решать задачу offline. Отсортируем запросы по <$$$\frac{l}{k}$$$, r>, где k — некоторое число. Очевидно, что мы можем легко добавить/удалить одно число (для этого можно поддерживать отдельный массив B, что $$$B_{i}$$$ = количеству учтённых вхождений числа i). Разобьем запросы на блоки с одинаковым $$$\frac{l}{k}$$$. Очевидно, что таких блоков $$$O(\frac{n}{k})$$$. Пусть сейчас насчитан ответ для отрезка [L; R]. Будем обновлять ответ, сдвигая левую и правую границу, пока они не станут равны границам текущего запроса. Заметим, что для каждого блока левая граница пройдет $$$O(k)$$$ шагов для каждого запроса блока, а правая — $$$O(n)$$$, так как правая граница запросов в блоке неубывает. Тогда всего левая граница пройдет $$$O(q \cdot k)$$$ шагов, а правая — $$$O(\frac{n^2}{k})$$$. Приняв n = q, k = $$$\sqrt{n}$$$ получаем асимптотику $$$O((n + q)\cdot\sqrt{n})$$$.

Немного кода

У этого варианта алгоритма есть есть две проблемы. Во-первых, он достаточно медленный.

Подумайте над второй проблемой сами.

Проблема

Алгоритм 2

Отсортируем запросы таким же образом, как и в первом алгоритме.

Назовём блоком запросы с одинаковым $$$\frac{l}{k}$$$. Заметим, что блоков $$$O(k)$$$. Обработаем запросы длины $$$\leq$$$ k отдельно. Теперь в каждом блоке длина запросы $$$\geq$$$ k, значит, в него входит позиция $$$k \cdot (\lfloor \frac{l}{k} \rfloor + 1)$$$. Для каждого такого блока сохраним указатель на максимальную правую границу R, которую мы обработали для текущего блока (изначально R = $$$k \cdot (\lfloor \frac{l}{k} \rfloor + 1)$$$). Пусть текущий запрос (l; r), а максимальная правая граница — R. Тогда добавим элементы R + 1, R + 2, ..., r. Обновим R. Заметим, что не были учтены только элементы l, l + 1, ..., $$$k \cdot (\lfloor \frac{l}{k} \rfloor + 1) - 1$$$. Их $$$O(k)$$$. Таким образом, на обработку каждого запроса необходимо $$$O(k)$$$ времени, а на обработку блока — $$$O(n)$$$. Так как всего блоков $$$O(\frac{n}{k})$$$, итоговая асимптотика — $$$O(\frac{n^{2}}{k} + q \cdot k)$$$. При k = $$$\sqrt n$$$, итоговая асимптотика составит $$$O((n + q) \sqrt n)$$$.

Еще несколько замечаний

3D Mo

Настало время научиться решать вторую задачу.

Алгоритм 1.

Заметим, что нам ничего не мешает сделать корневую по запросам одновременно с алгоритмом Мо. Разобьем запросы на блоки размера k. Внутри каждого такого блока запросов запустим алгоритм Мо. Итоговая асимптотика — $$$O(\frac{q}{k} \cdot (k^{2} + \frac{n^{2}}{k}))$$$. При n = k алгоритм имеет асимптотику $$$O(nk + \frac{n^3}{k^{2}})$$$. При $$$k = n^{\frac{2}{3}}$$$ получаем $$$O(n^{\frac{5}{3}})$$$.

Псевдокод

Алгоритм 2.

Отсортируем запросы, кроме изменений по <l / k, r / k, i>. Тогда у каждого запроса каждая граница лежит в определенном блоке. Для каждой такой пары блоков научимся отвечать на запросы. Давайте перебирать запросы изменения в хронологическом порядке, то есть переберем для каждой пары блока все запросы изменения, будем двигать указатели как в первом алгоритме. Для этого можно поддерживать указатель на последний обработанный запрос. Тогда асимптотика работы алгоритма — $$$O(\frac{n}{k} \cdot \frac{n}{k} \cdot q + qk)$$$ (так как каждый раз каждый l или r может пройти $$$O(k)$$$ шагов. Пусть n = q. Тогда асимптотика — $$$O(\frac{n^{3}}{k^{2}} + qk)$$$. Взяв $$$k = n^{\frac{2}{3}}$$$ получаем $$$O(n^{\frac{5}{3}})$$$.

Псевдокод

Алгоритм 3.

Будем сортировать по <i / k, l / k, r>.

Назовем блоком запросы с одинаковым i / k и l / k. Тогда для такого блока можно перебрать все запросы изменения, которые не были обработаны и актуальны для этого блока. Указатель L сдвинется не более чем на k для каждого запроса, а R — на $$$O(n)$$$ для каждого блока. Итого (n = q) $$$O(\frac{n^{3}}{k^{2}} + nk)$$$. При k = $$$n^{\frac{2}{3}}$$$ получаем асимптотику $$$O(n^{\frac{5}{3}})$$$.

Еще несколько задач.

Задача 1
Задача 2
Задача 3
Задача 4
Задача 5
Задача 6
Задача 7

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

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