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

Автор pkhaustov, 10 лет назад, перевод, По-русски

424A - Паша и приседания

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

424B - Город-миллионер

Можно отсортировать все города по возрастанию расстояния до города Томска. После чего требуется найти наименьший индекс t, для которого общее население p0 + p1 + ... + pt >  = 106. Для такого t значение dt является ответом. Ограничения на N позволяют использовать сортировку с асимптотикой O(N2) или любое другое решение с такой асимптотикой.

424C - Волшебные формулы

Рассмотрим следующие формулы:

Пусть . Посчитаем значение этой функции для всех значений i (0 ≤ i ≤ n). Это можно сделать за O(n), используя соотношение .

Преобразуем ci:

Также:

Таким образом:

Это означает, что если n / i нечетно, , иначе — . ci может быть вычислено за O(1), благодаря чему итоговая асимптотика решения — O(n).

424D - Биатлонная трасса

Из-за лояльных ограничений по времени для Java, некоторые решения с асимптотикой O(N4) были зачтены. Авторское решение имеет сложность O(N3logN). Основная идея — зафиксировать верхнюю и нижнюю границы. Затем, используя какой-либо абстрактный тип данных, для каждой правой границы найти наиболее подходящую левую границу за время не хуже O(logN). Например, можно использовать контейнер set в языке программирования C++ и его метод lower_bound. Для лучшего понимания можно посмотреть на следующее изображение.

Для показанного прямоугольника мы зафиксировали верхнюю границу строкой номер 2, нижнюю — строкой номер 5. Так же мы зафиксировали правую границу столбцом номер 6. Теперь требуется найти наиболее подходящую левую границу. Для этого мы можем разделить значение времени для любого прямоугольника на слагаемое, которое зависит только от правой границы, и на слагаемое, которое зависит только от левой границы.

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

424E - Цветная Jenga

Классическая задача на динамическое программирование для нахождения математического ожидания.

Определим некоторую функцию F(S) для некоторого состояния S — математическое ожидание количества минут до конца игры, если мы находимся в этом состоянии. Для каждого цвета мы можем вычислить вероятность, с которой этот цвет выпадет при броске кубика по тривиальной формуле , где c — количество граней такого цвета на кубике. Теперь требуется найти вероятность того, что мы останемся в том же состоянии еще хотя бы на одну минуту. Это можно сделать сложив вероятность выпадения черной грани и вероятности выпадения цветов, блоки цвета которых нельзя достать из башни на данный момент. Теперь мы можем найти значение это функции используя формулу:

Далее требуется придумать как закодировать состояния. Для того, чтобы уменьшить количество различных состояний можно воспользоваться тем фактом, что имеется всего-лишь 18 различных уровней, а не 27 (некоторые комбинации являются отражением друг друга). Для лучшей производительности рекомендуется использовать хеширование. Решение данной задачи требует хорошего понимания динамического программирования и достаточно хороших реализаторских навыков.

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

»
10 лет назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

i have a different approach for problem B.
binary search on (square of) the radius. and for a given radius, check if sum of all "neighbours" the circle encloses satisfies sum + s ≥ 106 or not.
my AC solution: 6470353

EDIT: my solution is , slightly more complex than author's . ;)

»
10 лет назад, # |
  Проголосовать: нравится -6 Проголосовать: не нравится

Problem A: "In one minute, Pasha can make some hamster ether sit down or stand up." I think in place of some you should use one. It cost me wrong answer during contest. Please look into the language ambiguities.

Thanks!

  • »
    »
    10 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Sometimes it's better to look at samples first, especially for A div2. As I see, you was debugging it for ~30 minutes — don't do it with A div2) Start reading B after first two failed attempts. I did the same today, just because of stupid mistakes. After 20-minutes delay you will defenetly get accepted, even if statement will be written on esperanto.

»
10 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится

Can someone explain the logic behind 424C — Magic formulas?

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    In my method, you can think about the associative property of xor and the cycle of modulo by some number~ ;)

  • »
    »
    10 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +4 Проголосовать: не нравится

    In my solution, I first xor all pi as P = p1^...^pn, and precompute a xor array X[1...n], where X[i] = 1^...^i. Next, for each k=1,...,n, compute Tk = (1%k)^...^(n%k). Note that if n = k*t + r, where 0 ≤ r ≤ k - 1, then in Tk, each value in {1,..,r} appears t+1 times, and each value in {r+1,...k-1} appears t times. That means we can compute Tk in O(1) time given precomputed Xs above. For odd t, Tk = (r + 1)^...^(k - 1) = X[r]^X[k - 1], and for even t, Tk = X[r]. And finally we can compute the ans in O(n) time. You can see my solution for details: http://codeforces.com/contest/424/submission/6466539

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Thanks a lot :D BTW you made a typo there X[r]^X[n] should be X[r]^X[k-1]. Really awesome explanation thanks!! :D

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится +4 Проголосовать: не нравится
»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

424D — Biathlon Track Do you mean you can do binary search to find the most suitable left border? Do you assume the perimeter will monotonically grow as you increase any given side?

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

У меня проблема в задаче Б: Мое решение работает на моем компьютере в среде Сode Blocs(С++), но когда я пытаюсь сдать эту задачу она падает на тесте 14. Я скопировал тест 14 и запустил на нем мою прогу. Она отработала правильно! Но когда я вновь попытался сдать этот файл, система вновь выдала неправильный ответ на тесте 14! Обьясните, пожалуйста как такое может быть.

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Как ты мог скопировать тест 14, если он отображается только частично -_-

»
10 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

Что-то тут странное написано:

"Из-за лояльных ограничений по времени для Java, некоторые решения с асимптотикой O(N^2) были зачтены."

Может там должно было быть O(N^4)?

»
10 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Your data in 424D is not strong enough. There is some Wrong Code also get an Accept, such as 6472530. There are 2 data I highly recommend to add. 6 3 0 0 10 10 1 1 1 1 1 1 1 3 1 1 3 1 1 3 1 1 1 1 should output:1 1 6 3. 3 6 0 0 10 10 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 should output:1 1 3 6.

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    can not agree more! the algorithm of binary search for this problem is wrong, but it can still get an accept.

»
9 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can someone please help me with Div2 Problem B.

The judge shows WA for the sample test case while it runs fine on my computer.

NOTE:

printf("%.07Lf")  does not works here but

cout << fixed << setprecision(7) << R; works

Why is this so? Here are my 2 submissions 9374428 and 9374522 Also it shows WA for my implementation using setprecision also.

»
8 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Shouldn't the time complexity be mentioned in the Editorial? -_- i found the same solution for E but i couldn't calculate the complexity + i couldn't write a hash function for the grid which is TOTALLY missed in the editorial....... you didn't even explain the optimum way of playing which i assumed right without proof and came here looking for answers, some of these editorials need to be re-written by top competitors .....