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

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

Будем решать задачу динамикой, но для начала нам нужно понять несколько вещей:

1) Каждый подотрезкок длины M отличается от следующего не белее чем в одной позиции тогда и только тогда, когда выполнены 2 условия:

a) Разрежем наш абажур ПОСЛЕ серой лампочки, и дальше разобьем его на R = N/M кусков длины M. Тогда прошлое условие точно должно выполняться для каждого из наших R отрезков.

b) Пусть для лампочки с номером x выполняется color[x] != color[(x + m) % n] и аналогичное условие для y != x. Тогда расстояние между x и y >= m.

(Доказательство почти тривиально=) )

2) Нарисуем такую матрицу M x R, где a[i][j] будет 1, если color[i + j * M] != color[(i + j * M — m) % n]. (столбцы нумеруются слева-направо, строки снизу вверх) В каждом столбце будет не более 1 единички(это по условию a). Тогда из условия b следует, что 1 будут идти слева направо и снизу вверх(график неубывает), потом пустой столбец(возможно несколько), и опять неубывающая последовательность, итп.

3) Рассмотрим строчку с номером m — 1. Она соответствует серой лампочке и следующим после нее на расстоянии кратном m. В ней в начале должно стоять несколько единиц, то есть в начале такая горизонтальная линия идет.

4) В остальных строчках либо пусто, либо есть F единиц. Сколько способов это покрасить, чтобы в конце мы опять вернулись в нужный нам цвет? Это легко считается простейшей динамикой D[F][last_color], можно ее и значительно быстрее считать, но нам это не нужно=)

А теперь начинается самое интересное — динамика для ответа=)

Зафиксируем число пустых столбцов P.

Будем идти по строкам снизу вверх и хранить то, сколько нам нужно поставить еще 1 в эту матрицу. Понятно, что нам надо поставить R — 1 — P единиц(мы не рассматриваем 1 столбец, для него все и так получится хорошо, ведь мы в 4 пункте так специальную дп считали).

dp[rows][ones]

Чтобы ее почитать, переберем сколько 1 мы ставим в эту строку. А дальше через несложные C из n по k понимаем, сколько способов расставить наши 1 в те возрастающие последовательности между P пустыми строки.

Также тут возникает 2 случая, соответственно из пункта 3 и 4.

Ну и нам остается просуммировать по всем P соответствующие dp[M][R — 1 — P].

Вот=)

PS Возможно я где-то накосячил с понятием верх-низ или с +-1, но я думаю суть понятна.

PPS Мы сдали эту задачу в дорешивание, на контесте мы пытались динамику из 4 пункта считать тоже какой-то формулой, но как-то сходу не получилось, и в общем недодебагали, обидно...

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

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

А можно объяснение первого sample-теста? Он у меня так и не сошелся в голове, т.е. задачу я так и не понял.

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

    Считаем, что у нас есть 8 чисел по кругу, первое равно 0. Ответ — количество таких расстановок единиц и двоек на оставшиеся 7 мест (что отвечает двум цветам), что любые два блока (i, i+1), (i+2, i+3) отличаются не более чем в одном разряде. Вот ответ для a_1 = 1, a_2 = 1, остальные получаются инвертацией (1 -> 2, 2 -> 1) цветов на четных / нечетных позициях:

    0 1 1 1 1 1 1 1

    0 1 1 1 1 1 2 1

    0 1 1 1 2 1 1 1

    0 1 1 1 2 1 2 1

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

    Первый тест, он непростой в плане понимания, у нас на нем к концу 5 часа решение перестало работать=) А как его в голове понять, я вообще не знаю...