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

Автор komendart, история, 6 лет назад, перевод, По-русски
Tutorial is loading...
Tutorial is loading...
Tutorial is loading...
Tutorial is loading...
Tutorial is loading...
Tutorial is loading...
Tutorial is loading...

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

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

Автор komendart, история, 6 лет назад, По-русски

870A - Поиск красивых чисел Идея, подготовка, разбор komendart

870B - Максимум максимума из минимумов Идея DPR-pavlin, подготовка, разбор mHuman

870C - Максимальное разбиение Идея, подготовка, разбор komendart

870D - Что-то там c xor запросами Идея, подготовка, разбор mHuman

870E - Точки, прямые и неоригинальные названия Идея, подготовка, разбор komendart

870F - Пути Идея, подготовка, разбор komendart

871E - Восстановление дерева Идея MikeMirzayanov, подготовка fcspartakm, разбор mHuman

Также спасибо координатору KAN, тестерам ifsmirnov, vintage_Vlad_Makeev, AlexFetisov и другим людям, участвовавшим в подготовке задач.

Tutorial is loading...

Код (C++) 31365874

Код (Python) 31365844

Tutorial is loading...

Код 31366254

Tutorial is loading...

Код 31365909

Tutorial is loading...

Код 31366223

Tutorial is loading...

Код 31365959

Tutorial is loading...

Код 31366002

Tutorial is loading...

Код 31368704

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

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

Автор komendart, история, 8 лет назад, По-русски

Всем привет!

Я не знаю, возможно, эта тема где-то уже поднималась, но быстрый гуглинг не помог.

Такое ощущение, что стандартная хеш-функция для целых чисел в gcc работает плохо (для Visual C++ все нормально).

Для 0 ≤ x ≤ 232 - 1

std::hash<int>()(x) == x 
std::hash<long long>()(x) == x

Для остальных чисел верно

std::hash<long long>()(x + (1LL << 32)) == std::hash<long long>()(x)

Например, код ниже работает в запуске на Codeforces более 10 секунд, потому что хеши всех чисел равны нулю.

Код

Можно ли что-то с этим сделать без написания собственной хеш-функции?

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

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

Автор komendart, история, 8 лет назад, По-русски

Когда-нибудь я расположу C и D в правильном порядке :)

675A - Бесконечная последовательность

Во-первых, в случае c = 0 мы должны вывести YES если a = b, иначе вывести NO.

Если b принадлежит последовательности, то b = a + k * c, где k является неотрицательным целым числом.

Поэтому ответ YES если (b - a) / c является неотрицательным целым, иначе ответ NO.

Code

675B - Восстановление картины

x a y

b m c

z d w

Число в центре может быть любым от 1 до n, потому что оно лежит внутри всех квадратов 2 × 2. Поэтому мы можем найти ответ с фиксированным числом в центре и потом домножить его на n.

Переберем все возможные x. Суммы в каждом квадрате 2 × 2 одинаковы, поэтому x + b + a + m = y + c + a + m и y = x + b - c.

Аналогично, z = x + a - d и w = a + y - d = z + b - c.

Квадрат с данными числам легален, если 1 ≤ y, z, w ≤ n. Мы должны просто проверить это.

Это было решение за O(n). Существует также решение за O(1).

Code

675C - Денежные операции

У нас есть массив ai и мы должны обнулить все числа внутри него с помощью минимального количества операций. Сумма всех чисел в массиве равна нулю.

Мы можем разделить массив на части с нулевой суммой, состоящие из последовательных элементов (первый и последний элемент считаются последовательными). Если часть имеет длину l, то мы можем обнулить ее с помощью l - 1 операции.

Следовательно, если мы сложим количество операций, то получим, что ответ равен n - k, где k — количество частей. Для того, чтобы ответ был минимальным, мы должны максимизировать k.

Одна из частей состоит из префикса и, возможно, суффикса массива. Остальные части являются подмассивами.

Давайте посчитаем префиксные суммы. Заметим, что префиксные суммы перед частями-подмассивами равны между собой, так как сумма чисел в каждой части равна нулю.

Следовательно, ответ равен n - f, где f — количество вхождений самого частого элемента среди префиксных сумм.

Бонус: как взламывать решения с переполнением?

Code

675D - Построение дерева

У нас есть двоичное дерево поиска и мы должны уметь быстро добавлять в него числа.

Пусть сейчас мы должны добавить число x. Найдем ранее добавленные числа l < x < r такие, что l максимально возможное, а r минимально возможное. Если только одно из этих чисел существует, то рассуждения почти не меняются. Мы можем найти l и r, например, с помощью std::set и upper_bound, если вы пишете на C++.

Мы должны сохранять отсортированный обход дерева, так как это свойство двоичного дерева поиска. Поэтому x должно быть правым потомком вершины l или левым потомком вершины r.

Пусть l не имеет правого потомка и r не имеет левого потомка. Тогда наименьший общий предок l и r (lca) не совпадает с l и r. Но тогда lca находится между l и r, а это невозможно, так как l максимально, а r минимально. Получается противоречие, поэтому l имеет правого потомка или r имеет левого потомка. Следовательно, мы точно знаем, кто из них станет предком x.

Это всё. Сложность решения .

Code

675E - Электрички и статистика

Введем индексацию с нуля. Уменьшим каждый ai на единицу. Также сделаем an - 1 равным n - 1.

Пусть dpi — сумма кратчайших путей из i в i + 1... n - 1.

dpn - 1 = 0

dpi = dpm - (ai - m) + n - i - 1, где m лежит между i + 1 и ai и am максимально. Мы можем найти m с помощью дерева отрезков / дерева Фенвика / разреженной таблицы.

Ответ равен сумме всех dpi.

Code

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

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

Автор komendart, история, 8 лет назад, По-русски

Всем привет!

Codeforces Round #353 (Div. 2) состоится завтра, 16 мая в 19:35 MSK. Я постарался сделать интересные задачи, надеюсь, они вам понравятся.

Хочу сказать спасибо GlebsHP за помощь при подготовке задач и MikeMirzayanov за Codeforces и Polygon.

Удачи!

UPD Разбалловка 500-1000-1500-2000-2500

UPD Разбор

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

Div. 2

  1. mimirrow

  2. Salvare008

  3. orzchimo

  4. student_hh

  5. Pain_Konan

Div. 1

  1. ksun48

  2. sugim48

  3. KrK

  4. cgy4ever

  5. nfssdq

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

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

Автор komendart, история, 8 лет назад, перевод, По-русски

617A - Слоник

Оптимально делать наибольший возможный шаг каждый раз. Поэтому слоник должен сделать сначала некоторое количество шагов на расстояние 5, а затем один или ноль шагов на меньшее расстояние. Следовательно, ответ равен .

Решение 15550796

617B - Шоколад

Нам дан массив, состоящий только из нулей и единиц. Мы должны разделить его на части, в каждой из которых ровно одна единица.

Особый случай: когда массив состоит только из нулей ответ равен нулю.

Рассмотрим общий случай. Во-первых нули на префиксе относятся к первому куску, нули на суффиксе относятся ко второму куску. Во-вторых, между каждой парой соседних единиц должно быть одно и только одно разделение частей. Между соседними единицами с индексами a < b всего b - a вариантов разделения. Поэтому мы должны перемножить эти значения для всех пар соседних единиц.

Бонус: каким является максимальный ответ при n ≤ 100?

Решение 15550806

617C - Поливка цветов

Первый радиус равен нулю или расстоянию от первого фонтана до какого-то цветка. Переберем все эти числа. Второй радиус будет равен максимальному из расстояний от второго фонтана до цветка, который не принадлежит кругу с первым радиусом. Теперь мы должны выбрать вариант с минимальным r12 + r22

Бонус: Я описал решение за O(n2). Можете ли вы решить задачу за O(nlogn)?

Решение за O(n2) 15550812

Решение за O(nlogn) 15550822

617D - Ломаная

Ответ равен одному, когда все координаты x или все координаты y совпадают.

Когда ответ равен двум? Переберем все пары точек. Пусть первая точка является началом ломаной, вторая концом ломаной. Только одна или две таких ломаных с двумя звеньями существуют. Они образуют прямоугольник с противоположными углами в первой и второй точке. Мы можем просто проверить принадлежность третьей точки прямоугольнику.

Иначе ответ всегда равен трем. Давайте построим вертикальные прямые через самую левую и через самую правую точки. Через третью точку построим горизонтальную прямую. Теперь, если мы удалим некоторые лишние лучи, получим подходящую ломаную.

Решение 15550843

617E - XOR и любимое число

У нас есть массив a

Давайте посчитаем массив (, ).

Xor подмассива равен .

Теперь запрос (l, r) заключается в подсчете количества пар i, j (l - 1 ≤ i < j ≤ r) .

Пусть мы знаем ответ на запрос (l, r) и знаем для всех v cnt[v] — количество вхождений v в .

Мы можем обновить за O(1) ответ и cnt если мы изменим правую или левую границу запроса на 1.

Поэтому мы можем решить задачу оффлайн за с помощью корневой эвристики (алгоритм Мо).

Решение 15550846

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

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

Автор komendart, история, 8 лет назад, По-русски

Привет!

Завтра, 23 января в 18:35 MSK состоится Codeforces Round #340 (Div. 2). Это мой первый раунд, надеюсь, вам понравятся задачи.

Спасибо GlebsHP за помощь при подготовке задач, Delinur за перевод условий и MikeMirzayanov за Codeforces и Polygon.

Всем удачи!

UPD Разбалловка 500-1000-1250-1750-2750

UPD Разбор

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

Div. 2

  1. AReesha

  2. kpw29

  3. I_love_Varechka

  4. zhaoxinyi

  5. thatday

Div. 1

  1. anta

  2. dreamoon_love_AA

  3. uwi

  4. Um_nik

  5. I_love_Tanya_Romanova

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

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