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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как решать J?

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

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

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

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

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

как решать Е?

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

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

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

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

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

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

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

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

        • »
          »
          »
          »
          »
          14 лет назад, скрыть # ^ |
           
          Проголосовать: нравится +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 ходов. Четность этого числа и определяет того, для какого игрока эта стратегия приводит к выигрышу.

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

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

»
14 лет назад, скрыть # |
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.

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

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

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

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

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

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

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

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

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

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

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

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

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

Ссылка

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

              1 2 1

              2 3 1

              2 4 1

              4 5 1

              3 5 4

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

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

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

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

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

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

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

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

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

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

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

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

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