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

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

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

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

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

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

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

WESLEY SNEIJDER & GALATASARAY! CHAMPIONS

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

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

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

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

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

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

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

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

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

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

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

»
11 лет назад, скрыть # |
 
Проголосовать: нравится +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.

»
11 лет назад, скрыть # |
 
Проголосовать: нравится +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.

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

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

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

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

    Code Here

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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