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

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

Правильно ли я понимаю, что завтра в 11.00 (по москве) будет проходить раунд opencup (5 часов)?

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

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

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

PS вопрос снят, уже появялся интерфейс Саратовского гран-при, предлагаю после раунда обсудить задачи тут.

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

А это контест с Петрозаводских сборов? Кто-нибудь знает точно?

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

Надеюсь, не поздно: но не могли бы вы ссылку на контест оставить? Спасибо.

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

всем привет! Как решать задачу О? ("Yet another game")

И где можно будет дорешевать?

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

    дорешивание уже открыто на сайте

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

    Мы Гаусса сдали.

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

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

    Код: http://pastie.org/3413601

    А кто-нибудь решение M не за K^2 знает?

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

как надо было решать dna-sequences(div.2)?

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

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

    Выходит, что надо разделить граф на две доли, где ребра будут только из одной доли в другую. Делить вершины на двудольный граф можно дфс'ом, там же и проверить на возможность это сделать. Просто если есть цикл нечетной длины, то impossible.

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

      надо ли явно строить граф? и это разве не K^2?

      UPD. Можете код показать?

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

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

        код

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

          ну вообще это решение тлится, вот ваш код (в него я вставил генератор теста) и он на сервере не успевает отработать

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

            ok, а как надо было решать?

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

              У нас было такое решение, но мы не успели додебажить: заметим, что если дуги расположить можно, то и набор дуг сверху и набор дуг снизу по отдельности образуют две "скобочные последовательности". Заведём под каждую стек, заведём массив, где по номеру отрезка можно найти его координаты и другой массив на 20000 элементов, где для координаты будет храниться пара — номер начинающегося/заканчивающегося отрезка и признак его начала/конца. Идём по этому массиву. Если встретили начало отрезка, пробуем пихнуть его сначала наверх, потом вниз. Если не получается — построить систему дуг невозможно. Пихнуть можно, если конец данного отрезка имеет координату меньшую, чем конец отрезка на вершине стека. Пока не знаю, правильно ли это решение.

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

                У меня не зашло, WA#2. Впрочем, это писалось за 10 минут до конца, и я мог набажить.

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

                Извините, ошибся, у меня было немного по другому

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

          Как показывает дорешка, возиться с неявным графом не стоило.

          for (int i = 0; i < n; ++i)

          for (int j = 0; j < n; ++j)

          if (i != j)

          if (x[i] > x[j] && x[i] < y[j] && y[i] > y[j]) {

          g[i].pb(j);

          g[j].pb(i);

          }

          Круто, чо)

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

      а жадно нельзя решить? запоминать в дереве отрезков концы верхних дуг и концы нижних?

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

      Круто! 120 * 10000 ^ 2 — всего 12 миллиардов. Я даже специально написал вопрос жюри, нет ли каких дополнительных ограничений. Успех)

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

        Главное — вера! ;)

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

        Во, а как вы сдали? :)

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

          Мы никак не сдали, в том-то и дело. А так бы выиграли.

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

            А, тогда обидно. Вы быстрее решение писали или у вас квадрат не зашёл?

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

              У меня даже в мыслях не было писать за квадрат.

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

    Мы решали М так:

    Отсортируем все отрезки по их началу. Заведем 2 стека — нижние и верхние дуги, для каждой дуги будем хранить ее конец.

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

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

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

    Данное решение работает за один пробег по циклу, каждый отрезок 1 раз кладется в стек и достается из него, то есть асимптотика алгоритма O(K)

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

      И зашло?

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

        У нас первый АС по М =)

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

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

      Как программа определит в какой стек кидать вторую дугу (в порядке возрастания начал), в таких тестах: 3 0 4 1 3 2 5 Решение: (([))] и 4 0 6 1 3 2 5 4 7 Решение: ([(][))]

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

        Мда, 2 тест валит мою программу... Что еще раз доказывает недотест в задаче М.

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

кто-нибудь покажите код задачи AZ, сделал за O(|S|*26), но ТЛ7 не уходит.

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

    Значит сложность не O(|S|*26) (или константа неоправданно большая). Я тоже делал за O(|S|*26) -- и ВА49 как бы намекает, что такая сложность должна заходить по времени.

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

      У нас на контесте было WA50 и WA52. Похоже, эти тесты связаны с неправильной обработкой больших ответов.

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

    если кому интересно, вот код зашел с первого раза. Правда там некоторый изврат с определением переполнения, а так вполне понятно =)

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

      да... переполнение это конечно беда, но log10 тащит!)

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

Как решать J?

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

    Подвешиваем дерево за 0 вершину. Раздваиваем каждую вершину еще одной фиктивной с временем дохода до нее равным 0 и временем обработки di (чтобы обработку текущей вершины тоже считать как обход поддерева). Подсчитаем суммарные ki и суммарные времена обработки ti каждого из непосредственных поддеревьев. Пусть vi = ki / ti. Тогда нетрудно показать мы должны обходить деревья в порядке от больших vi к меньшим.

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

Странно, писали вчера этап в дополнительное время, сегодня в мониторе были видны, а сейчас ни в мониторе, ни в рейтинге нас нет)

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

как решать Е?

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

    Пишем перебор для мелких n и k=b/a (с помощью map<vector<int>, bool>), распечатываем ответы, находим закономерность.

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

      Ну или тупая эмуляция.

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

        я просто хотел узнать обоснованное решение...

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

          Заметим, что конечное состояние всегда одинаковое. Тогда посчитаем сколько останется пустых стаканов: q = b div a; сколько стаканов можно перелить в один стакан Теперь посчитаем сколько всего будет непустых стаканов. w = n / q + (n%q ? 1 : 0) Ну и теперь проверим на четность n — w; Если нечетно, то победил первый.

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

            конечное состояние всегда одинаковое?

            n = 5, a = 1, b = 4, то 2 варината как минимум

            1 1 1 1 1

            1) 2 1 1 1

            2) 2 1 2

            1) 3 2

            либо

            1 1 1 1 1

            1) 2 1 1 1

            2) 3 1 1

            1) 4 1

            не?

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

              Высота дерева игры всегда одинаковая.

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

              важно понять, что они по сути эквивалентны.

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

            А вот с этого момента пожалуйста поподробнее.

            Пример: n = 6, a = 1, b = 3. Возможны два конечных состояния: 2 2 2 и 3 3. Соответственно будут и разные выигрывающие игроки.

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

          Во-первых, заметим, что если от b отнять остаток от деления на a, то ответ не изменится, т.к. этот остаток все равно нельзя ничем заполнить. теперь b делится на a, поделим b на a и заменим a на единицу. Понятно, что ответ все еще остался тем же. Теперь один из игроков может использовать следующую стратегию: каждым своим ходом делать так, что во всех стаканах, кроме полностью заполненных и возможно одного стакана будет налита 1 единица жидкости. Это можно делать следующим образом: после первого хода это верно. Дальше если на нашем ходу свойство выполняется, то возможно 2 варианта: 1) во всех стаканах по 1, тогда просто сливаем любые два стакана. Свойство не нарушилось. 2) в одном стакане не единица (заполненные мы не рассматриваем). Дольем в него из любого оставшегося стакана. Теперь противник может либо сделать аналогичный ход и не нарушит свойство, либо он может слить две единицы, тогда могут быть 2 варианта: 1) в недозаполненный стакан можно долить 2 единицы жидкости. Тогда просто доливаем и восстанавливаем свойство. 2) в недозаполненный стакан можно долить только 1 единицу жидкости. Тогда либо мы уже проиграли(тогда стратегией может воспользоваться другой игрок) либо остается еще одна единица, которой можно заполнить этот стакан и убрать его из рассмотрения, оставшиеся стаканы удовлетворяют описанному свойству. В итоге вся жидкость будет находиться в (n+b-1)/b стаканах, а значит всего в любом случае было сделано n-(n+b-1)/b ходов. Четность этого числа и определяет того, для какого игрока эта стратегия приводит к выигрышу.

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

            хм... нетривиальное доказательство, куда проще было написать какое-либо быдло-решение... спасибо за объяснение

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

Помогите понять почему получает WA2 такое решение на задачу M:

Заведем массив размера 2 * N, где для каждого начала будем хранить его конец, допустим массив t. Также в булевском массиве used будем хранить в ячейке начала каждого отрезка false если еще не взят никуда и true иначе. Также все концы пометим true чтобы отдельно их не рассматривать. Решаем рекурсивно — сначала запускаемся от всего отрезка calc(0, 2 * N - 1) и бежим по нему циклом, если встретили начало отрезка и он не помечен и он полностью лежит в текущем, то помечаем его, что он взят и запускаемся от него calc(i, t[i]), иначе если его конец лежит дальше конца текущего отрезка, то увеличиваем некий счетчик cnt. Запускаем данный алгоритм 2 раза, если после вторго раза счетчик cnt не равен нулю то мы не смогли взять некоторые отрезка — ответ impossible, иначе — possible.

Если кому-то не лень, то расскажите в чем ошибка...

  • »
    »
    13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    for(int i = p; i < r; i++)
    

    Это цикл из метода calc. Мне кажется, что здесь должно быть i = l.

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

      нет, в l-ой позиции начинается текущая дуга поэтому надо начинать l + 1

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

      спасибо за заметку, в решении такого не предпологалось просто скопировал в pastebin криво. пофиксил — for(int i = l + 1; i < r; i++). Но тем не менее, меня больше интересует корректен ли алгоритм впринципе или это все таки ошибки в реализации, кототорые я возможно перестал замечать?

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

I don't understand task N, so can you explain me what was task about? thanks.

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

Расскажите пожалуйста идею решения задачи I

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

Выложил видео разбора задач контеста Саратова в Петрозаводске на ютуб:

Ссылка

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

    Мне кажется хорошо бы если выкладываешь в паблик адекватно называть ролик (например, "2011-2012 Зимние Петрозаводские сборы, контест Саратовского ГУ (открытый кубок), разбор задач") и расставить теги. Просто через годик-другой ссылка потеряется, наплодится еще роликов с похожими именами и трудно будет найти то, что нужно.

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

в разборе ссылкой выше есть такой момент: "нужно найти цикл минимального веса, это можно сделать Флоидом, так как вершин не очень много".

А как искать минимальный цикл Флоидом? Или как это делать вообще?

UPD: Ну, я знаю только так: удалим любое ребро (v,u), найдем Дийкстрой кратчайший путь в новом графе от v к u

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

    для каждого ребра лучший ответ — это длина ребра плюс расстояние от конца ребра до начала

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

      можете по подробней, и код если можно покажите

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

        для каждого ребра a->b найдем длину цикла минимального веса, который через него проходит. В этом цикле после ребра a->b будет идти путь из b в a, который уже посчитан флойдом. Выберем лучший результат для каждого ребра. http://pastebin.com/VHJwdc3C

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

          как я понимаю, в общем случае это работает только для ориентированного графа?

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

            Да, этот алгоритм только для ориентированных графов. Но для неориентированных это тоже можно сделать за N^3. Для каждой вершины v делаем следующеее: запускаем из v алгоритм дейкстры, который формирует дерево кратчайших путей. теперь перебираем все ребра, которые не вошли в это дерево и для каждого ребра u->v считаем величину w(u->v)+d[u]+d[v] (w — вес ребра, d — массив кратчайших расстояний). Таким образом найдем цикл минимального веса.

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

              либо я что то не понимаю, либо это не работает (скорее всего конечно 1е), но ведь путь до вершины u и вершины v может пересекаться и мы этот участок учтем дважды, например на графе:

              1 2 1

              2 3 1

              2 4 1

              4 5 1

              3 5 4

              после запуска дейкстры из первой вершины, например...

              или фишка в том, что мы позже найдем ответ?

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

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

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

    Инициализируем матрицу расстояний d следующим образом: вершина a видит вершину b, если отрезок их соединяющий не пересекает ничего плохого и b находится по часовой стрелке от a, тогда d[a][b] = dist(a,b), во всех остальных случаях (включая a = b) d[a][b] = inf. Запускаем обычного флойда. Величина наименьшего цикла — минимум среди значений d[i][i].

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

      а вы сейчас написали общий алго или к конкретной задаче про ежи?

      Если это общий, то что за плохое и хорошее?

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

      UPD: кажется я понял, это для задачи С. Если граф ориентированный, то ответ найдет правильно. А если граф неор., то цикл может найтись типа "1-2-1"

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

кто в задачи про палиндромы (Д) прошел 4 тест, подскажите, в чем его хитрость?

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

    В архиве Петрозаводска четвёртый тест такой:
    4
    abcdef
    edc
    baxyzprq
    pzyx

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

      Да, только хотел написать, что понял как его пройти, но все равно спасибо