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

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

Странно, что до сих пор нет анонса.

Сегодня, 7 сентября (пятница), в 15:00 по Москве.

Удачи!

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

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

в 15:10.

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

Ни у кого нет проблем с регистрацией и коннектом?

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

В Kawigi написал решение, отправил его, но почему то он отправил предыдущий run но локально сохранил текущий. Почему так произошло, и как с этим бороться? P.S в первый раз его использовал

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

сраная 555, понятно что делать, ну с*ка, пока напишешь эти 100500 динамик

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

    100500=1? Да и та — предподсчитать C(n,k).

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

      можешь рассказать это решение?

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

        Предподсчитаем все цешки до 3100на3100. Далее переберем двумя циклами сколько столько строк инвертировали нечетное число раз (пусть их a, всего строк n) и сколько столбцов инвертировали нечетное число раз (пусть их b, всего строк m). Тогда несложно увидеть, что число единичек в таблице ровно a*(m-b)+b*(n-a). Если это число совпало с S, а числа Rcount-a и Ccount-b четные неотрицательные, то к ответу надо добавить C(n,a)*C(n+(Rcount-a)/2-1,(Rcount-a)/2)*C(m,b)*C(m+(Ccount-b)/2-1,(Ccount-b)/2). Разбираем что это такое — C(n,a) — это мы выбрали какие строки будут "нечетными", на их обслуживание надо сразу же потратить a преобразований над строками. Теперь у нас осталось Rcount-a преобразований над строками и они идут парами, т.к. теперь уже все строки должны быть инвертированы четное число раз. Причем эти пары можно раскидывать как угодно. Перешли к стандартной задаче разбить число (Rcount-a)/2 на n целых неотрицательных слагаемых. Это число способов равно в точности C(n+(Rcount-a)/2-1,(Rcount-a)/2). Остальные два сомножителя — аналогичные для столбцов. Вот и все.

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

          спасибо за объяснение, но я уже сам решил только цшками... однако, не самая лучшая идея, писать сразу, что пришло в голову на контесте

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

            расскажыте свою идею неС-шками

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

              честно говоря это треш, но все же тоже зашло: понятно что нужно разбить rcount на h слагаемых и ccount на w, причем, если среди h слагаемых ровно i четных, а среди w слагаемых j четных, то единиц будет i(w - j) + j(h - i)

              научимся считать следуещее: количество разбиений числа n на m слагаемых, что среди слагаемх ровно p четных (понятно, остальные m - p нечетные)

              будем делать это так: посчитаем динамику even[x][y] — количество разбиений числа x на у слагаемых, что все y слаегаемых четные, а так же динамику odd[x][y] — количество разбиений числа x на у слагаемых, что все y слаегаемых нечетные, понятно, как считать эту динамику:

              odd[x][y] считается аналогично

              заведем теперь динамику f[p] — количество способов разбить n на m слагаемых, что среди слагаемх ровно p четных

              и действительно, это количество разбиений в котором $p$ четных чисел, которые в сумме дают i, а остальная сумма набирается нечетными слагаемыми. Cmp берется из того, что мы на какие-то p мест поставим четные числа, на остальные m - p мест нечетные

              теперь мы имеем два массива frow и fcolumn, теперь надо пробежать по (i, j) — количество четных элементов в строке и столбце (в разбиении строки и столбца на слагаемые) если i(m - j) + j(n - i) = s прибавим к ответу frow[ifcolumn[j]

              PS. от дурной головы, рукам покоя нет, вот это все писал

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

                по крайней мере у вас есть своя и правильная идея..не то, что у других — отсутствие каких либо идей ;)

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

          Красиво.

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

    Эм? Там все через цшки считается

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

      ну это таргеты может через цшки все там считают, а в моей комнате много решений (подавляющее большинство), как и у меня, это >=2 динамик

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

        Ну так тогда может не задача виновата?

        Вон в харде вообще 2 принципиально разных решения в зависимости от "ширины программы" — и я не жалуюсь

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

          В свете результатов систестов хотелось бы узнать как решался хард.

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

          А можно тогда поподробнее пожалуйста, про второй тип решения ради интереса?

          Я придумал но не успел накодить, что сделав backtracking перебрав конечные позиции и получив строку из '0', '1' и '?' (что угодно), если их меньше половины (потому что диапазон движения бегунка больше половины), то катит inclusive-exclusive, а если их больше половины, то диапазон движения меньше половины, и следовательно вопросительных знаков меньше половины и катит перебор с set'ом.

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

            Ну да, либо включение-исключение, либо полное построение, это и есть те 2 принципиально разных решения

            И насчет бактракинга я не понял — мы просто с каждой позиции берем момент, когда последний раз строка могла быть валидной

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

              А как быстро включение исключение считать?

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

                Да вроде бы должно проходить и 2^18 * 18 * 36. На всякий можно было попробовать чуть уменьшить границу для включений.

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

                  Проходит и так. У меня под завязочку как раз — 1.3 с одной стороны и 1.6 с другой. То есть было бы хотя бы 37 ограничение — пришлось бы оптимизить

                  А, ну и границу для включений у меня не получилось бы уменьшить еще и из-за МЛ

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

                  А откуда число 18 взялось?

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

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

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

                  Добавил тупой перебор если масок много и прошло в практисе. Жаль мог на СРМе сдать первый "настоящий" хард

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

              Под backtracking'ом я имел ввиду, что получаем маску для фиксированной конечной позиции, откатываясь назад: '<' и '>' инверсируются, а цифра либо crash'ит текущую позицию, если не совпадает, либо превращает текущий символ в вопросительный знак, если совпадает. Кажется термин backtracking тут что-то был не к месту...

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

        могу сказать про свою комнату, все, кто решали, решали с помощью C-шек.

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

Моё решение по 1000-ке (не успел найти баг но на практисе сдал)

Найдем множество масок M такое что : начальное X хорошее <=> для какой-то маски M из множества X & not M == goal & not M

Для каждой стартовой позиции выполняем действия, помня маску изменений. Если в какой-то момент обрабатывая goal мы бы получили опять же goal, добавляем эту маску в множество. Дополним множество так, чтобы для любых масок A, B из него, A&B тоже было в нём.

Утверждение: таких масок мало, т.к. они все подмаски какой-то циклической сдвинутой хрени.

Остаётся просчитать включение/исключение, рассмотрим какой вклад вносит отдельная маска в ответ: это 2^(кол-во единичек) за вычетом вкладов всех подмасок которые есть в нашем множестве. Сумма вкладов и есть ответ.