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

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

Скоро начнётся квалификационный раунд Яндекс.Алгоритм 2015. Это последняя возможность для тех, кто не участвовал в тренировочном раунде или не решил в нём ни одной задачи, пройти на отборочные раунды, которые состоятся 24 и 30 мая и 6 июня.

Сам квалификационный раунд продлится 100 минут и пройдёт в виде виртуального контеста: каждый участник сам может выбрать время начала в периоде между 17 мая 0:00 и 18 мая 0:00 МСК. Это значит, что некоторые участники потенциально смогут продолжать участвовать до 1:40 МСК, поэтому не стоит обсуждать задачи до этого времени. Для прохождения в отборочный раунд необходимо решить хотя бы одну задачу.

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

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

I started the contest, but problem statements seem to be unavailable. Instead of problem statements, there is just text "Problem statement is unavailable".

edit: All problem statements are now available in english.

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

WESLEY SNEIJDER & GALATASARAY! CHAMPIONS

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

To advance to the elimination round, it is necessary to solve at least one problem.

Is it also sufficient to advance by solving only one problem?

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

Вот в правилах сказано:

Результат отборочного этапа включает три значения: сумму зачетных очков, количество решенных задач и суммарное штрафное время за три раунда.

То есть получается, чем в большем количестве раундов ты участвовал, тем лучше? Как-то это странно. Или можно участвовать в одном раунде? Не все же могут поучаствовать в утреннем раунде.

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

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

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

      Да в этом и вопрос. Но меня не интересует топ-30 и очки, а топ-512. Как они определяются? То есть вначале идут люди с очками, а потом без очков. И те кто без очков сортируются по количеству задач?

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

        Участники сортируются по сумме очков, потом по количеству задач (в сумме по трём раундам), потом по штрафному времени (опять же, в сумме).

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

My first submission stayed with the "waiting" status for about half an hour and I had a stupid bug that I had to wait half an hour to correct. I hope this doesn't happen in the Elimination rounds.

Also, the scoreboard was not live but updated every few minutes. I could not see my new position immediately after getting a problem Accepted.

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

How can I change my country (in the standings etc)? It says that I'm from USA and I can't find how to change it. I haven't put "USA" to anywhere.

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

Расскажите, пожалуйста, как решать B.

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

    Бинарный поиск по ответу. Зафиксировали какой-то максимальный вес. Добавили все ребра Ui которых не превышает зафиксированного веса. Затем построим конденсацию данного графа и посчитаем степени захода для каждой компоненты. Пусть c1 — количество компонент, у которых степень исхода = 0, а c2 — у которых степень захода = 0. Тогда можно получить ответ с зафиксированным весом только в том случае, если max(c1, c2) <= 1

    Code Here

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

      Хм,работает ли это на графе

      1 2 1
      1 3 1
      2 4 1
      3 4 1
      

      ?

      Ответ -1

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

        И правда, не работает :) Скорее всего, weak tests.

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

        Я проверяю, что конденсация — бамбук и ловлю ва2. Спс, бросил дебажить.

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

          против бамбука будет

          1 2 1 1 3 1 2 3 1

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

            Да это работает, я погорячился с понятием бамбук, имел в виду, что в топсорте есть рёбра между соседними.

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

      После сжатия компонент на самом деле нужно проверить, что они образуют цепочку (возможно с дополнительными ребрами)

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

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

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

    А был еще кто-нибудь кто подумал, что надо минимизировать сумму? Есть соображения, что с ней вообще можно в таком случае делать?

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

      Ничего. Это NP-трудная задача.

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

      И в продолжение темы — я пол контеста думал, что ребра, которые не указаны, имеют вес 0. Кто-то умеет решать такое при заданных ограничениях?

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

        Вроде как я умею.

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

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

        Так как мы будем каждый раз мэрджить меньшую вершину к большей, то каждое ребро будет слито не более чем логарифм раз. В итоге выйдет что-то около

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

          Похоже на правду. А если держать списки рёбер в хешсетах, то вообще будет . Здесь — стоимость поддержки кучи из n вершин, а — стоимость слияния, если стоимость слияния двух вершин имеет порядок количества рёбер из меньшей вершины. Остаётся вопрос: как быстро искать вершину, в которую из данной нет ребра? Утверждается, что если просто перебирать номера всех оставшихся вершин по порядку, то количество неудачных попыток будет не больше, чем количество рёбер из вершины, а это число уже заложено в сложность.

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

          А зачем отсортированность поддерживать?

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

          Построим неориентированный граф по ориентированному(убрав ориентацию ребер). Потом решим задачу 190E - Контрнаступление (не реклама!:) ) за O(n + m). Те вершины, что в одной компоненте будут в одной КСС по 0-ребрам.

          Далее осталось не более O(sqrt(m)) вершин, а значит если удалить повторяющиеся ребра, то можно явно провести все 0-ребра(их будет O(m)), далее можно решать как обычно

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

What's the solution for "Optimal Playlist"?

My Unaccepted Solution:

f(x) -> returns if graph with edges that cost at most x can make a playlist.

  • It converts the graph into a DAG by shrinking SCCs. Then it uses a modified version of Kahn's algorithm to check if there are more than one vertex with a in-degree of 0 at any state. If there are, it means that we can't make a playlist.

It uses binary search to find the least x such that f(x) is true, which is the answer.

My Implementation

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

    That is incorrect because of this test case: (the edges)
    1 2
    1 3
    there isnt a walk that goes to 2 and three so yeah ofc you'll get werong answer

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

      Can you elaborate a little bit? I think my algorithm works for this case.

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

        give me a walk that crosses vertex number 2 and vertex number 3 it is impossible because you can't get out from either 2 or 3

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

          I know. it's impossible according to my algorithm too. It first removes 1 because it has a in-degree of 0. With the removal of 1st vertex, both vertices (2 and 3) start to have 0 in-degree. Since there are more than one vertex that has a in-degree of 0, there isn't any walk that visits every vertex at least once.

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

            Oh Lol sorry i didn't know Kahn's algorithm, anyway i think if you check if the i'th component is connected to the i+1'th it get's accepted

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

    You need to clear adj2 after every call to f().