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

Автор Ripatti, 12 лет назад, По-русски

A. Будем идти сверху вниз и восстанавливать ответ. Нижнюю грань 1й кости восстановить легко. Далее по двум граням 2й кости можно установить какая пара чисел должна быть на верхней и нижней грани. Если одно из чисел совпадает с числов на нижней грани 1й кости, то 2я кость восстанавливается однозначно, и так далее. Если мы смогли восстановить все кости — выводим YES. Если где то возникла неоднозначность, то можно показать, что эта однозначность будет сохраняться и для всех последующих костей. То есть получится хотя бы 2 разничных ответа, поэтому нужно выводить NO.

Автор — Ripatti .

B. Сначала сгенерируем все числа k-боначчи, не превышающие n. Для k ≤ 32 это можно сделать в лоб, а для больших k можно заметить, что числа k-боначчи до 109 являются только степени двойки (и еще 0). Итого получим не более 100 чисел.

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

Почему все полученные числа будут различны? Вот одно из возможных доказательств:

F(k, n) = F(k, n - 1) + F(k, n - 2) + ... + F(k, n - k)

F(k, n - 1) = F(k, n - 2) + F(k, n - 3) + ... + F(k, n - k - 1)

Вычтеми из 1го равенства 2е и получим F(k, n) + F(k, n - k - 1) = 2F(k, n - 1), то есть 2F(k, n - 1) ≥ F(k, n). Это неравенство так же справедливо и для n ≤ k.

теперь предположим, что жадный алгоритм даст 2 одинаковых числа F(k, x) в разложении. Но тогда, в силу неравенства, мы должны были взять число F(k, x + 1). Противоречие.

Впрочем, доказывать это не требовалось, можно было просто поверить что жадность пройдет:)

Авторы — Gerald , Ripatti .

C. Сначала посчитаем число белых и черных пикселов в каждом столбике. После этого посчитаем сумму черных и белых пикселов на каждом префиксе в последовательности столбиков. Это позволит нам за O(1) вычислять количество черных и белых пикселов на любом отрезке столбиков.

Далее воспользуемся динамическим программированием. dp[i][j] будет хранить наименьшее число перекрашиваемых пикселов на префиксе от 1го столбика до j-го, причем цвет последней полосы будет белым для i = 0 и черным для i = 1.

Далее dp пересчитывается следующим образом: dp[0][0] = dp[1][0] = 0

Ответом будет min(dp[0][m], dp[1][m]).

Итого решение за O(nm + m * (y - x)).

Автор — Ripatti .

D. Обычный поиск в ширину. Состояние — положение головы + маска, которая задает положение хвоста, а именно: двумя битами кодируется относительное положение каждого сегмента (кроме головы) относительно предыдущего. Итого в маске максимум 16 бит, оценка на общее число состояний — 48 × 15 × 15 (на самом деле можно даже показать оценку порядка 38 × 15 × 15).

Далее нужно просто все очень аккуратно реализовать.

Автор — Ripatti .

E. Дано: z = [x / 2] + y + xy. Это равносильно

z = [2k / 2] + y + 2ky, где x = 2k, k > 0
или
z = [(2k + 1) / 2] + y + (2k + 1)y, где x = 2k + 1, k ≥ 0.

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

z = k + y + 2ky, k > 0
или
z = k + y + (2k + 1)y, k ≥ 0.

Еще пару шагов:

2z + 1 = 2k + 2y + 4ky + 1, k > 0
или
z + 1 = k + 2y + 2ky + 1, k ≥ 0.

2z + 1 = (2k + 1)(2y + 1), k > 0
или
z + 1 = (2y + 1)(k + 1), k ≥ 0.

Из второго уравнения видно, что z должно быть вида 2t - 1, иначе z + 1 имеет нечетный делитель и мы можем подобрать решение. Из первого же уравнения получаем, что 2t + 1 - 1 должно быть простым, иначе опять можно подобрать решение. Если же z = 2t - 1, а 2t + 1 - 1 — простое, то очевидно, что уравнение неразрешимо.

Простые числа вида 2a - 1 являются простыми числами Мерсенна, на данный момент найдено всего 46 чисел такого вида. Показатели степени для первых 40 из них можно найти, например, здесь.

Автор — Ripatti .

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

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

Заминусовали разбор. Видимо, всем не понравились задачи.

UPD. Уже не актуально.

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

    Мне всё понравилось, кроме Е. Задача на гугление -- не круто.

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

    Задачи ОЧЕНЬ понравились. Главное, что было нужно, — не делать глупых ошибок. А, так как я их делаю почти в каждом контесте, я допустил багу и в этом((

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

Полностью согласен с yarrr. А так контест прикольный)

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

Ripatti, хватит создавать аккаунты и плюсовать себя с них!

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

Мне от интересно решая В я вспомнил про "банкомат" и что не любую сумму можно выдать жадно. А как тут, без влияния луны, понять что жадность работает? Очень интересно!!!

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

    (Для чисел Фиббоначи => жадность работает, для k>30 получаем степени двойки => жадность работает ) => Жадность работает :-)

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

    Без влияния Луны выходит как-то так:

    Сначала можно показать, что любое нат. число представимо в виде суммы нескольких чисел k-боначчи.

    Показывается это индукцией. База очевидна. Пусть это утверждение выполняется для всех целых чисел до f(n) (рассуждение верно для любых k>1, так что его я не пишу). Очевидно, что f(n+1)<=2*f(n) (ведь f(k,n+1)=2*f(k,n)-f(k,n-k) для n>k+2, и f(k,n+1)=2*f(k,n) для n<=k+2). Тогда для любого целого x: f(n)<x<f(n+1) верно, что x-f(n)<f(n+1)-f(n)<=2*f(n)-f(n)=f(n), т.е. представимо в виде суммы таких чисел. А, значит, и x=f(n)+(x-f(n)) также представимо в необх. виде.

    Ну а дальше очевидно. Если отнять от x макс. f(k,n): f(k,n)<=x, то полученное число также представимо в виду суммы чисел k-боначчи. Плюс в разборе уже было показано, что все слагаемые будут различными.

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

      кажется первую часть можно проще доказать:) n=1+1+...+1

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

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

        Из того, что все числа просто так представимы, еще не следует, что можно спокойно писать жадность.

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

          жадность всегда найдет какой-то ответ (возможно с одинаковыми числами), потому что среди чисел есть 1.

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

6 тест 225D - Змейка

15 15
@..............
...............
...............
...............
...............
...............
...............
...............
...............
...............
...............
.............9.
.............8.
...........567.
.............

а где голова змейки?

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

    Возможно, последняя строчка — это знак "тест вот тут обрезан" и нам не видно конец теста.

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

      @yeputons can you please clear the problem E(unsolvable) 2 z  + 1 = 2 k  2 + y  + 4 KY  + 1,  k  > 0 and and z  = 1 +  k  2 + y  2 + KY  + 1,  k  ≥ 0 . how this line comes ??

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

    6й тест такой:

    15 15
    @..............
    ...............
    ...............
    ...............
    ...............
    ...............
    ...............
    ...............
    ...............
    ...............
    ...............
    .............9.
    .............8.
    ...........567.
    ...........4321
    

    просто система при показе "обрубает" длинные тесты и ставит в конце многоточие.

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

Для C можно было написать динамику с бОльшей памятью и временем работы, но, как мне кажется, проще в исполнении: Динамика трехмерная dp[color][j][i] — минимальное количество перекрашиваний для состояния: j — число столбцов, включая текущий с цветом color (0 — белый, 1 — черный), i — номер текущего столбца. mas[i] — число перекрашиваний для i-того столбца, чтобы превратить его в белый, очевидно, отсюда: n-mas[i] — число перекрашивай для i-того столбца, чтобы превратить его целиком в черный.

Переходы: для каждого i-того столбца: если перекрашиваем в белый цвет: dp[0][j][i] = dp[0][j-1][i-1], 2 <= j <= min(y,i+1) (т.е. идем на увеличение количества белых столбцов), и dp[0][1][i] = { x <= j <= y } min(dp[1][j][i-1] + mas[i]) — здесь мы меняем цвет столбца, если это возможно (в предыдущей последовательности черных столбцов было j: x <= j <= y). Аналогичный переход, если мы захотим красить текущий столбец в черный цвет.

Ответ, очевидно, {x <= j <= y}min(dp[color][j][m]) — берем все значения для тех состояний, когда последние j столбцов были цвета color.

Асимптотика: O(n*m)

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

    но не нужно, та что в разборе попроще будет, да и памяти меньше

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

Спасибо за проблемсет, интересный вышел. Только вот не понимаю, зачем давать задачу на "погуглим". На олимпиаде такое не прокатит.

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

Так и не понял, какая в задаче А может быть неоднозначность: по-моему, ее либо можно восстановить единственным способом, либо такой башни вообще не существует. На каждом шаге нам известная верхняя грань t. По ней однозначна нижняя грань (7-t). Известны две боковые a[i] и b[i]. Если числа t, 7-t, a[i], b[i] попарно разные, то идем на следующий шаг, иначе — "NO", т.к. противоречие условию. На следующем шаге t = 7-t, т.к. по условию кости соприкасаются одинаковыми гранями. Можно пример входных данных, когда два варианта восстановления?

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

    по условию кости соприкасаются разными гранями

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

Хх...задача Е была мне по силам, на Теорию чисел, составил ряд показателей степеней двойки, но про числа Мерсена не додумался.

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

Задача В, эхх как же ты меня подвела) вот как же так было забыть про то что дальше одни степени двойки пойдут? В детстве на эти же вилы наступал) http://article-factory.ru/fokusy/obuchenie-fokusam/790-volshebnaja-tablica.html

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

    Можно было и не додумываться до этого. Можно было додуматься до того, что чем больше K, тем быстрее растут члены последовательности. А считать очередной элемент можно используя префикс-суммы. Очередная левая граница будет max(0, i — k). То есть первому члену в программе соответствует К-ый(т.е. 1). А до него все нули.

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

Вопрос про задачу E. 40-е число Мерсенна (2^20996011)-1 по модулю (10^9)+7 будет 395976712. Почему в 40-вом тесте ожидается 697988359?

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

В задаче С разве не

dp[0][i] = [x,y]min(dp[1][i-j] + sum-of-black[i-j+1, i])

dp[1][i] = [x,y]min(dp[0][i-j] + sum-of-white[i-j+1, i])

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

    Кстати, на олимпиаде я запутался вот с этим. Но на самом деле разницы вообще никакой, так как тут главное, чтобы было dp[c][i] = min(dp[c ^ 1][i] ... ). А хотя это вполне очевидно, ведь в конце всё равно берется минимум из двух величин dp[0][n], dp[1][n]. Так кто мешает предположить, что 0 = 1, 1 = 0. Простите, если непонятно изложил свою мысль.

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

about D,i have other solution,easy to implement. just do it as normal BFS first , and we can think now the snake adjust it's head. After adjustments , snake can go to the @ directly ans at this time we think it's tails as wall. In fact i use force to find 100,000 states first , and from every states i use another bfs to let snake try to eat food.

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

In problem D, I understood that using 2 bits we can encode that how can we get from a previous position to new position. 2 bits are used to represent whether the head moves left, right, forward. Next thing we need to encode in state is representation of present position of snake which I guess is done by mask. I couldn't understand how can we represent the mask using 16 bits.

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

    We can use mask to describe the position of i-th segment of snake relative to the i-1-th segment(for example,0 for left, 1 for down, 2 for right and 3 for up.) There are at most 9 segments, we need to encode 8 of them. That's why we need 16 bits. After making such mask, you can go through all 4 directions and find, which mask we'll have after moving to this direction.

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

У меня на таком тесте

15 15
...#####......#
.##...##.#.#.##
.##.#.#.......#
.##.....#######
.######.#......
....###.####.#.
#.#.###.####...
#..........##.#
#.###########.#
#..##...#......
##....#.#.##.#.
##.##......#...
##############.
#@987654321....
##########...

валится, должно 99 у меня -1, помогите.

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

Реально ли решать задачи типа C без использования динамического программирования (и других чуждых для меня вещей), просто опираясь на какую либо идею и логику?

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

    Динамическое программирование — это как раз и есть идея, а не какой-то конкретный алгоритм. Идея в том, что при поиске ответа, разбивать задачу на подзадачи, и решать её последовательно, при этом на каждом шаге использовать результат полученный на предыдущих шагах. Соответственно до этой идеи можно додуматься, и я уверен, что вы уже не раз использовали ДП, даже не подозревая о том, что это ДП =) Но когда знаешь про этот инструмент, и есть опыт его использования, то, очевидно, начинаешь быстрее понимать как и где его нужно применить.

    В данном примере же идея такова: мы находим сначала ответ для одного столбика, потом для двух, для трёх и тд., пока не получим ответ для всей исходной матрицы.

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

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

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

        Вот есть текущая позиция. Для неё мы переберём все возможные полосы, которые будут заканчиваться в этой текущей позиции. И из всех этих вариантов выберем с минимальным ответом. Так мы получим оптимальный ответ для текущей позиции. А когда последняя позиция станет текущей, то соответственно и для неё.

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

"Далее предлагается действовать жадно — отнимать от n самое большое число k-боначчи, не превышающее n до тех пор, пока не разложим полностью." Можете продемонстрировать на небольшом примере,а то не совсем понятно как это сделать

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

    Здравствуйте. Добавлю, что мне вообще разбор и даже условие задачи B,похоже, совсем не понятно. Сказано, что все числа к-боначчи есть степени двойки, но в ответах есть и отличные.На 5 2 ответ 0 2 3?? Заранее спасибо.

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

      Сказано, что для больших k k-боначчи есть степени двойки, т. е. фактически текущее число есть сумма всех предыдущих.
      0 0 ... 0 1 1 2 4 8 16 ...

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

My english is very bad and i can't understand what the author means when he says in the solution of the problem C :"After that you should calculate number of white and black pixels for every prefix in sequence of columns." What does he mean for prefix? =(

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

    Prefix means number of first elements, i.e one of prefixes for string "abcahkjdf" is "abc"

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

You can solve problem B using binary search.

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

There are 47 mersenne primes dicovered not only 46!

http://mathworld.wolfram.com/news/2009-06-07/mersenne-47/

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

For problem B, is there any proof why greedy works?

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

Can anybody guide me, I am not able to pass test case #14 of DIV2 C. Here is my solution...

My submission

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

Can anyone explain me how we are ensuring that no column is less then x size in problem statement C ? I got AC however it was calculating for vertical lines being less than x but I am unable to understand how it is ensured.