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

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

Всем привет! Первый раунд опенкапа закончился. Давайте обсудим задачи.

UPD. Результаты раунда — http://opentrains.snarknews.info/~ejudge/res/res10271

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

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

Я к сожалению сегодня писал один и всего 2 часа. Так и не смог побороть Б. Считал все в дробях, дроби сокращал, но что то видимо не учел.

Может есть какие идеи, где стандартно мог проколоться?

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

    Вообще, там нужно пользоваться тем, что ни одна дробь не превосходит 1, но строго больше нуля. Считая в лоб мы можем натолкнуться на последовательность с 100000 простыми числами, где ни сокращение дробей, ни длинная арифметика уже не помогут.

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

      Контест было лень писать, но разве не превосходит единицу?

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

        В условии написано, что ai > 0 при i > 0, поэтому такой случай невозможен.

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

          А, ладно, я таки не умею читать условия. Но все-таки нехорошо писать в формате вывода |ai| < 109 и больше ничего, ведь именно на этом акцентируется основное внимание

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

            Так написано же в двух местах: и в условии, и в формате ввода (сразу после |ai| ≤ 109).

            Если такие ограничения не вводить, не будет однозначного представления для рациональных чисел (это, кстати, тоже написано).

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

Подскажите решение C и I из div1. в I поток надо пихать?

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

    В I есть решение без потока динамикой за O(nm)

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

      Можешь рассказать?)

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

        Основная фишка — что граф ациклический, так что топологически его отсортируем и будем считать, что все дуги идут слева направо. Будем строить пути одновременно. В каждый момент есть текущая вершина на пути из A в B и текущая вершина на пути из C в D. Будем двигать ту из них, которая левее.

        Это решение находит просто два пути. А чтобы они рёберно не пересекались, нужно добавить к состоянию ещё один бит: верно ли, что мы только что пришли из состояния, где две вершины были равны. Если да, то сразу же идти опять в такое состояние нельзя.

        Состояний O(N^2), переходов в сумме O(N*M).

        А как решать потоком?

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

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

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

            Тогда сложность станет O(M^2). Разве не так?

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

              Нет, будем сумма квадратов степеней вершин, что не превосходит O(NM).

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

                Все понял, туплю. Ведь кратных ребер нету в графе

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

          Никак, нет способа заставить поток течь именно из A в B, а из C в D.

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

            Как-то зашёл минкост в котором сделал цену прямых ребер 1,а обратных 100000000.
            И у двух ребер сделал цену. S>C = 200000000,D>T = 200000000

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

              А можно подробнее? Минкост с не кососимметричной матрицей цен это что-то странное

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

                Ну помимо того что я таким образом задаю ребра, я при восстановлении ответа для первого пути запрещаю проходить по ребрам S>C и D>T. А так просто минкост Белманом. И если не находит поток нужной величины или не получается восстановить оба пути то вернуть NO.
                Тест приведенный ниже оно проходит.
                UPD: нашёл тест на котором всё же не работает.

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

              Судя по всему, это заходит по той же причине, что и это решение. Контртест против него есть ниже.

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

    Во втором дивизионе по I зашло такое: найдём кратчайший путь до одной пары, удалим все рёбра этого пути, найдём кратчайший до другой пары. Если не нашлось, поменяем пары вершин местами и повторим.

    Вроде в первом дивизионе условие не отличается.

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

      Кажется, контртест:

      16 18

      1 3

      2 3

      3 4

      4 5

      4 6

      5 7

      6 7

      7 8

      8 9

      8 10

      2 11

      11 12

      12 13

      13 6

      5 14

      14 15

      15 16

      16 9

      1 9 2 10

      Любой кратчайший путь из 1 в 9 проходит через 8 (единственная смежная с 10 вершина) и перекрывает все пути из 2 в 10, а любой кратчайший путь из 2 в 10 проходит через 3 (единственная смежная с 1 вершина) и перекрывает все пути из 1 в 9.

      В то же время ответ: 1-3-4-5-14-15-16-9, 2-11-12-13-6-7-8-10.

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

        Действительно. Моя программа, получившая AC, выдаёт "NO".

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

    В С заходит следующее решение. Покрасим каждую вершину в случайный цвет, а затем заведем очередь вершин, которые не подходят под условие задачи. На каждом шаге берем вершину из очереди и смотрим в какой цвет мы можем ее перекрасить, чтобы количество соседей с таким же цветом было не больше одного (т.к. всего соседей 5, то это всегда возможно). Затем вершину удаляем и смотрим на ее соседей, удовлетворяют ли они условию (если нет, то добавляем в очередь).

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

      Это правильное решение. Если не красить когда можно, то можно доказать 5E итераций. Это не более, чем 12,5V. Если этого не делать, то я думаю верно 15E.

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

        А можно, пожалуйста, доказательство в студию?:)

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

          Ну как — на каждом шаге число рёбер, соединяющих вершины одного цвета, уменьшается хотя бы на один.

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

            О, клево, спасибо! У нас просто была реализация чуть другая (где вершины добавлялись по одной и перекрашивалась некоторая цепочка), и мы как-то не задумывались о том, что суммарное-то число перекрасок будет ограничено чем-то небольшим.

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

      В каких случаях раскраска графа будет невозможна? Не могу доказать, что раскраска всегда существует, но и опровергнуть это никак не получается.

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

        Полный граф на 6 вершинах не подойдет?

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

          Нет, не подойдет, это второй семпл :)

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

          Нет, там можно сделать по 2 вершины каждого цвета, и у каждой, очевидно, будет не больше одного соседа того же цвета

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

        Раскраска возможна всегда, это следует из того что после каждого перекрашивания вершины, нарушающей условие, количество пар соседей одинакового цвета уменьшается.

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

          Но ведь не всегда уменьшается. Мы можем в одном месте коллизию убрать, а у соседа добавить..

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

            К вершине, которую мыперекрашиваем была 2 ребра ее цвета, а стало одно, следовательно кол-во ребер между вершинами одного цвета уменьшилось.

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

          Тогда я ничего не понимаю: написал алгоритм согласно комментариям MSPA, но получаю TLE#41. http://pastebin.com/5s2g95em

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

            На первый взгляд у вас две проблемы: 1. Вы перекрашиваете все вершины (даже те, которые удовлетворяют условию). 2. Программу можно ускорить, если принять во внимание тот факт, что после перекраски вершины, в очередь может добавится только один сосед.

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

              Большое спасибо: исправил, получил AC 308ms 8.79Mb

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

      Изначально в очереди все вершины, которые имеют соседа такого же цвета? Если у вершины итак только 1 сосед такого цвета,то что с ней делать? На таком шаге кол-во ребер, соединяющих вершины одного цвета, не изменится? Сортируется ли как-то очередь, может ли в очередь быть добавлен элемент, который там уже есть? Может ли быть в очередь добавлен элемент, который был из нее удален ранее?

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

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

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

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

Понял только за минуту до конца контеста, но там ещё нужно было по времени упихать. В дорешку зашло.

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

Как решать D, H?

Наши идеи:

По D, если бы не надо было домножать на p(A) + 1, то ответ, вроде, , где A, B, C итерируются по всем подмножествам U.

По H, утверждается, что у нас любая пара циклов если и имеет рёберное пересечение, то это какой-то элементарный путь из нуля. Значит, сперва вырезаем бесполезную часть графа (всякие деревья, отходящие от циклов), а потом выделяем циклы в виде последовательности вершин степенью три. Далее "убиваем" крайние вершины в последовательности и вершины в оставшейся части через одну.

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

    По H: Запускаем следующий рекурсивный DFS из всех смежных с вершин, смежных с нулевой: для каждой вершины считаем количество путей в нулевую вершину, кроме того, по которому мы пришли. Если количество путей больше единицы, то значит, что это вершину нужно удалить, при этом вернув 0, иначе возвращаем количество путей. Если по окончанию DFS возвращает нам 1, то нужно удалить ту вершину, из которой мы запустили DFS.

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

    D: Воспользуемся тем, что p(A) это сумма 2ai. Переберём i. В ответ войдут всевозможные произведения функций с множителем 2i по множествам, в хотя бы одном из которых есть i-тый элемент. Т.е. к ответу прибавляем

    H: Отметим все вершины, смежные с 0. Теперь удалим вершину номер 0. Тогда у нас останется дерево с отмеченными вершинами. Цикл появится, если будет путь между отмеченными вершинами. А это можно сделать одним обходом в глубину жадно.

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

      По d это наш косяк, что такое заходило. Это не планировалось, можно почистать во всех точках за n*2^n. Напишу как, когда буду не с телефона, если до этого никто не напишет. А функцию просили, чтобы со скоростью вывода не было проблем.

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

        Мы это n*2^n упихивали в TL ногами)

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

          Странно. У нас на плюсах 0.5 секунды, на джаве секунда. Бывает рекурсивный, он наверное подольше.

          Раз никто не рассказал, давайте расскажу, что имелось ввиду.

          Посчитаем такое преобразование . Тогда H' = F' * G' поточечно, кроме того .

          Осталось научиться быстро считать F' по F. Обратное аналогично

          Это считается динамикой

          ,

          Физический смысл dp[k,A] сумма по подмножествам в которых все элементы кроме 1..k те же, что в A.

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

      Можно более подробно по D, что входит в суммы и как их считать.

      Да и в H, что удалять из этого дерева с пометками?

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

        В D если подставить H в результат, то получится, что нужно посчитать по всем B и C. Сначала избавимся от + 1. Нужно посчитать . А это считается как .

        Теперь осталось разобраться с . Распишем, что такое p. (квадратные скобки равны 0, если выражение ложно, и 1, если истинно).

        Поменяем порядок суммирования. Внутреннюю сумму мы можем переписать как сумму по всем B и C минус сумму по множествам, в которых i нет. .

        Ну и в итоге нужно ответ считать по формуле

        +

        Теперь по поводу H. Вот мы поставили отметки в вершинах, связанных с 0. Теперь забудем, что эта вершина существует, у нас останется дерево. Теперь нам нужно удалять вершины в этом дереве, чтобы в каждой компоненте было не больше одной помеченной вершины. Запустим дфс, который будет считать, сколько достижимых отмеченных вершин в поддереве. Как только получается, что в какой-то вершине набралось хотя бы две отмеченные достижимые, эту вершину нужно удалить и после обработки детей, дфс должен вернуть из неё 0.

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

    В D можно очень просто сосчитать функцию . Для этого можно просто для каждого множества сосчитать сумму значений f от всех его подмножеств и сумму значений g от всех его подмножеств и перемножить. Дальше можно методом включений-исключений перейти от q к h. Вот код, чтобы понятней было: http://pastebin.com/f5LSaXZG

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

    "Честное" решение D: Определим conv[F] как . Тогда обратный к conv оператор определяется так: .

    Пусть . Рассмотрим . Значит H = conv - 1[H'] = conv - 1[conv[F] * conv[G]], где * — поточечное умножение.

    Осталось научиться считать conv[H]conv - 1[H]).

    Определим , где первые k бит X — подмножество A, а остальные совпадают с A. conv0[H] = H, convn[H] = conv[H].

    Тогда convk[H](A) = convk - 1[H](A) если , иначе .

    Аналогично, conv - 1k[H](A) = conv - 1k - 1[H](A) если , иначе .

    Итого, получается решение со сложностью O(2n * n): http://pastebin.com/Y2Hw2saP.

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

А каким образом команды в "Sponsor standings" попадают? Почему там нет половины ACM команд?

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

    Выдержка из правил

    4.2.4 В спонсорский зачёт каждого Гран-При входят команды со статусом ACM, участвовавшие в данном Гран-При в соответствии с 4.2.1. и выполнившие при этом предложенные организаторами спонсорского зачёта требования. Гран-При в спонсорском зачёте считается состоявшимся, если хотя бы одна участвующая в спонсорском зачёте команда успешно решила хотя бы одну задачу.

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

Расскажите как решать F и J?

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

    F: у выпуклого пятиугольника всего пять триангуляций, каждая выглядит как "одна вершина, из которой торчат две диагонали". Переберем их все, для каждой проверим, что это действительно триангуляция. Я проверял так: середина каждой диагонали лежит внутри пятиугольника, диагонали не пересекают стороны и друг друга.

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

      Можно просто проверить, что площадь 3 треугольников совпадает с площадью всего пятиугольника, ну и что они все ненулевые.

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

    В J перебор для первых 2000 значений показал, что один из прямоугольников всегда имеет обе стороны не более 10. А второй, очевидно, должен иметь стороны как можно более близкие к квадрату. Ну и написать можно следующий перебор. Переберем обе стороны первого прямоугольника от 1 до 100. Одну из сторон второго прямоугольника от корня оставшейся части до этого же корня минус 10000. Оставшуюся сторону можно выразить через предыдущие три, если таковая вообще существует. Выбираем наилучший ответ и выводим.

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

      100 вроде маловато чуть-чуть, например:

      999999999000010001

      4000000402 999999992 1000000007 89 113

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

        У Div2 были ограничения до 109, а у Div1 до 1018.

        UPD: это я к тому, что pkhaustov участвовал в Div2-версии соревнования, а Petr пишет про Div1-версию задачи J.

        Действительно, у Div1 в решении та же идея (один прямоугольник — большой и почти квадрат, другой очень маленький), но реализация требует чуть большей аккуратности. В тестах (Div1) сумма сторон маленького прямоугольника бывает больше 500, а разность сторон большого — больше 1 300 000.

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

          Эм... В той версии условий div2, что была у меня (скачана и распечатана до контеста) ограничения были до 1018.

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

            Так вот в чём дело было — в Div2 в начале открывались не просто старые условия, а старые Div1 условия?.. Я изучу этот вопрос.

            Самое интересное, что Div2 в этот раз порешали лучше, чем обычно идут наши Div2-версии. Если всё было действительно так, надо взять этот приём на заметку.

            В «настоящих» Div2-условиях у каждой задачи в названии должно было быть (Division 2) большими буквами.

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

              В «настоящих» Div2-условиях у каждой задачи в названии должно было быть (Division 2) большими буквами.

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

                O_O

                Я изучил этот вопрос. Действительно, был момент, когда из репозитория можно было собрать такую версию условия (в ней ещё была ошибка в ответе на первый пример, 10 вместо 12). Видимо, это и произошло.

                Из хороших новостей — в этот момент другие условия, скорее всего, не пострадали.

                Прошу прощения за ошибку в условии Div2.

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

                  Вот кстати да, у нас в условии была эта опечатка в семпле.

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

                  Мне кажется, что это неправильно исправить ошибку в сэмпле и не сделать броадкаст на всех участников.

                  И да, в ответ Бурундуку про неиспользование Полигона: вот такие, например, досадные ошибки и вкрадываются при отсутствии достаточной автоматизации.

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

Как решать Е?

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

    Будем решать с конца — удалять по одному треугольнику.

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

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

    Первое условие тоже несложно. Если у треугольника уже две стороны "внешние", то он подсоединён ко всего одному оставшемуся треугольнику и его можно безопасно удалить. Если же у него одна внешняя сторона, то его можно удалить тогда и только тогда, когда у него есть хотя бы одна вершина, не находящаяся на границе внешней грани (т.е. не бывшая на внешней грани изначально и не являющаяся вершиной какого-то удалённого треугольника).

    Это всё придумали halyavin и Michael, я просто примазываюсь :)

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

      Круто! Спасибо. Правда, в дорешке такое у меня пока получает TL137:(

      UPD. уже ОК, оказывается плохо делать HashMap<Long, Edge>, и считать первый аргумент как (from << 32) | to. Потому что hashmap работает долго из-за коллизий, которые возникают, когда считает хеш от лонга...

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

      Можно еще добавлять грани в порядке убывания разности расстоний до внешней грани и исходной грани.

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

        А что делать, если разность одинаковая? Можно довольно легко построить пример, на котором оно не будет работать (если можно задавать порядок посещения для тех, у кого разность одинаковая).

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

          Можно пример? Я вроде умею доказывать, что это работает.

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

            Пусть есть некоторый треугольник, у которого есть три соседа. Если для этих соседей разность будет одинаковая, то и для внутреннего треугольника она будет такая же. Тогда может случится ситуация, что мы добавим вначале соседей (и после этого центральный треугольник не будет соединен со всеми другими треугольниками).

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

            А какое доказательство? Может проще найти в нем ошибку?:)

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

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

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

        UPD: не прочитал что многоугольник выпуклый.

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

      Hard to understand after translating. Can you please translate the keypoints of the solution?

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

        Key points: 1) Since the answer is always "yes", it suffices to find the last triangle we add — after that we're left with a smaller problem of exactly the same type 2) the last triangle should possess two properties: after removing it the remaining figure must stay connected, and another figure formed by the outside of original figure plus the already removed triangles must stay connected. 3) we will maintain two things: the number of edges of each triangle that is "outside", and whether each vertex is "outside". 4) for the outside figure to stay connected, it is necessary and sufficient for at least one edge of the removed triangle to be outside 5) out of those, for the remaining figure to stay connected, it is necessary and sufficient that either two edges of the triangle to remove are outside (meaning that just one edge connects it to the figure, and it can be safely removed), or one edge of the triangle is outside AND at least one of its vertices is not outside.

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

Как решалась задача C с покраской графа?

UPD Прошу прощения. Не обратил внимания, что выше объяснено.

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

По задаче С wa29, пожалуйста, помогите найти ошибку: код

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

    Кажется, самый простой способ найти ошибку в Вашем далеко не читаемом коде — это в конце проверить, верен ли ваш ответ и позапускать решение на маленьких случайных тестах.

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

How about G?

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

    Play randomly until each connected component becomes small (<= 10 possible moves). After that, compute grundy function of each component in O(2^n), and xor values for all components. With high probability, result will be non-zero.

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

    One of the solutions involves only trivial observations, but a fair bit of coding.


    When we have a game position, it can be partitioned into independent regions where moves can be made. Two possible moves are immediately dependent when they share at least one cell.

    We will recognize three classes of regions based on two boolean outcomes.

    1. Is it possible to invalidate all possible moves in the region by a single move?

    2. Is it possible to make a move such that there remains at least one possible move from the region?

    An example of (1) but not (2) is a square of 2 × 2 or 3 × 3 cells. Such a region (a Type I region) requires exactly one move to disappear.

    An example of both (1) and (2) is a rectangle of 2 × 4 or 3 × 4 cells. In such a region (a Type II region), we have a choice: it requires either one or two moves to disappear.

    An example of (2) but not (1) is any large region. Such a region (a Type III region) requires at least two moves to disappear.


    Our first goal will be to have only Type I and Type II regions left on the board. We can try to achieve a perfect grid of Type II regions (4 × 2 rectangles) by trying to place every square of the pattern shown on the left picture. Of course, Felix will mess things up, and the resulting board will look more like the right picture (result of a 16 × 20 game up to this point).

    first picture           second picture

    There are 8 Type I regions, 8 Type II regions and 2 Type III regions on the right picture.


    In the second part of the game, we eliminate all Type III regions by detecting them and making random moves in these regions.

    In the endgame, we have only X Type I regions and Y Type II regions.

    • If X and Y are even, the player who makes a move loses if both play optimal: the winning strategy for the other player is to keep them both even after their turn. If we find Sophia in such position, we can make a random move and hope Felix does not follow the winning strategy.

    • If X is even and Y is odd, we make by eliminating one Type II region, so that both are even after our turn.

    • If X is odd and Y is even, we remove one Type I region just the same.

    • Finally, if X and Y are both odd, we move in a Type II region such that it leaves a new Type I region, effectively making the new values of X and Y even: X increases by one and Y decreases by one.

    The more Type II regions we had at the beginning, the more are our chances to eventually avoid the situation when X and Y are even and Sophia has to make a move. If we avoid that at least once before the game is over, we follow the above simple strategy to win.


    The above strategy is a simple case of calculating and using Grundy numbers for regions, as in winger's solution: they are 1 for Type I regions and 2 for Type II regions. Still, this solution requires only knowledge of elementary game theory and invention of simple symmetric strategies.

    When checked several times against the judges' test cases with different random seeds, it won at least 293 out of 300 games.

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

      My solution with region cutoff of <= 16 wins ~99.85% of games on 16x16 field and nearly 100% on 25x25, but unfortunately is too slow to pass the TL.

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

I don't have a login. How can I get the problems? Will the contest be published on gym?

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

when did it start

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

Где посмотреть задачи?

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

Как решать A (Barabashka, Div.2)? Или как пройти 2-ой тест? Беру сперва красный стул, потом 2,3,4 предметы совподающие, а потом немогу забрать "blue book", так как он 1 на столе остался, а на карте есть "blue bottle".

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

    Один предмет можно брать несколько раз

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

      Спасибо, теперь решил. А как решали B (div.2)? Мне TLE na test 37, так как использую арифметику больших числ.

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

        Жаль, что EZBigInteger еще нет.

        А вот EZ Collections уже есть! http://codeforces.com/blog/entry/14328

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

          Вы так говорите, как будто эту задачу можно решить с помощью BigInteger.

          Ведь не успеет всё равно, как его оптимально ни пиши.

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

    Перед тем, как показывается очередная карта, все предметы ставятся на стол.

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

Grand Prix of Siberia в это воскресенье начнется в 11:00 по московскому времени? Просто на сайте кубка время на сервере, видимо, до перевода на зимнее время, поэтому непонятно, во сколько начнется?

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

Я отправил заявку неделю назад на регистрацию сектора, а open cup не отвечает. Написал пару дней назад им еще раз, все еще глухо. Хотя перед тем, как отправить заявку, я уточнял по поводу участия в кубке координатора сектора — ответили через пару часов.

Как быть? Что делать? Хочется в это воскресенье этап написать.

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

    Данные по новым секторам будут высланы завтра.

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

      Можно обновить расписание на оф.сайте, если уже что-то более-менее конкретно известно? Там до сих пор не указано, какой этап будет после Grand Prix of Siberia и когда вообще он будет:)