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

Автор GlebsHP, история, 6 лет назад, По-русски

Если вы вдруг хотите принять участия в Яндекс.Алгоритме 2018, но по какой-то причине ещё не зарегистрировались, то стоит пройти по этой ссылке.

Квалификационный раунд соревнования стартовал в 00:00 по Москве в субботу 17 февраля. Раунд является виртуальным соревнованием продолжительностью 100 минут, начать которое можно в любой момент до 23:59 воскресенья 18 февраля (время московское).

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

Жюри настойчиво просит участников никак не обсуждать задачи не публиковать решения до 01:40 19 февраля.

Желаем успехов и надеемся, что вы получите удовольствие от процесса решения задач!

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

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

Auto comment: topic has been translated by GlebsHP (original revision, translated revision, compare)

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

I really enjoyed the problems even if I couldn't solve a lot, very interested in the editorial :). Good job!

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

Ваше участие в соревновании завершено. Вы можете отправлять решения

Что они имеют ввиду?

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

Монитор обновляется с большой задержкой(минуты 3-4), надеюсь к отборочным раундам эта задержка уменьшится.

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

    Мы знаем о такой проблеме, надеемся, что в рамках Квалификационного раунда она не является критической. Для отборочного этапа мы придумаем решение.

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

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

Семнадцатый стандарт давно уж гордо ходит по стране, а на contest.yandex.ru до сих пор с++11.

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

    В отборочном раунде будет доступен как минимум c++14. Спасибо за предложение.

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

Please change English title to English. Because it is written in Russian I firstly ignored this.

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

Is there a way to end contest earlier if everything is already blind/AC?

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

Автокомментарий: текст был обновлен пользователем GlebsHP (предыдущая версия, новая версия, сравнить).

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

Why do I have to wait something like 4 minutes for my submission to be included in standings? Is it like that in further rounds as well?

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

6 hours remaining before end of qualification round. Hurry up! :)

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

Возможно будет порешать задачи завтра вне конкурса?

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

I don't get it, is there any advantage to submitting blind??

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

    Submitting blind reduces penalty time (which is irrelevant in qualification round)

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

01:40, February 19th Moscow time has passed. How to solve F?

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

    Suppose minimal such distance is d. Then we can place servers on the diameter in vertices that are at distance d from diameter ends. Now we can just binary search for d

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

      Is there a way to solve this if the number of servers > 2?

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

        I do not see easy way to generalize this solution

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

          Alternative approach.

          Fix d and root the tree. Take a look at node v with maximum depth. For covering it, there should be a server somewhere in subtree of d-th parent of v, say u. With greedy conclusions it's optimal to set one of the servers exactly in u.

          Then choose v as the deepest node from the set of nodes uncovered by the first server (it can be disconnected but it doesn't matter) and set the second server in the d-th parent of new v.

          Now check whether each node is covered.

          Seems to be generalizable for > 2 servers

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

        If you can solve this problem: https://main.edu.pl/en/archive/oi/16/gas, then you can enlarge the number of servers a little.(I guess...)

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

        My solution seems to work in with arbitrarily number of server.

        First binary search the farthest distance d. For a fixed d, I'm going to find the least possible number of servers to cover all vertices within d. Let dp[i] be the critical vertex in the subtree of vertex i, where critical vertex is the deepest one still uncovered, if all the vertice in the subtree of i are covered, the critical vertex is the highest one placed with server.

        Then, for each vertex i, collect critical points from its direct children. If the critical point is placed with server but farther than d, skip it. For those uncovered critical points, keep the deepest one. For those with server, keep the highest one. Considering following cases:

        • No critical points: If i is root, place a server. Anyway, dp[i] = i
        • Exists a critical point with server and no critical points uncovered or all uncovered points can be covered by the highest critical point with server: dp[i] =  the critical point with server.
        • Othewise: If i is root or distance between i and an uncovered critical point is exactly d, place a server at i and dp[i] = i. Otherwise, dp[i] =  the deepest uncovered critical point.

        Then, I can find the least possible number of servers to cover all vertices within d.

        It's somehow greddy and I didn't prove it.

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

    Find center of tree. Then cut the deepest or second deepest subtree, find diameter of each component is also pass.

  • »
    »
    6 лет назад, # ^ |
      Проголосовать: нравится +11 Проголосовать: не нравится
    1. Find diameter, and centre of tree, if it's an edge disconnect that, if it's a node, disconnect either of the edges from it that are part of diameter.
    2. Find diameter of the 2 new trees obtained.
    3. The centres of these trees are your answers.

    Centre is defined as midpoint of any diameter. I don't have a formal proof for it, but it works. Intuitively, since we can prove centre is unique, it makes sense for it to be answer for a single server.

    Also can be easily generalised for an arbitrary K number of servers since at each step, you find diameters of each tree(of the forest) in total O(N) time, so solution is overall O(N·K).

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

      Wow,your solution is cool,but could you tell me about if you should choose 3 nodes,how to proof that your solution is still correct.And I don't know well how to divide the diameter.

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

        I think the 3 server nodes would be the original tree center, and the 2 centers of the partitioned trees. I don’t have a way to prove/test it, but it seems somewhat intuitive by the same arguments as for 1 or 2 servers.

        However, now that you mention it, I believe it is non-trivial to extend this for more than 3 nodes, possibly just doing a greedy(choosing node that minimizes current answer most) works, but I can see why it might not.

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

          Nope:

          7
          1 2
          1 3
          1 4
          2 5
          3 6
          4 7
          

          The only optimal solution for three servers is 2, 3, 4, but the center is 1.

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

How to solve E?

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

How to solve D?

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

    If we want the smallest possible sequence which we cannot form a triangle, it will be Fibonacci sequence. consider at most the first 100 numbers in a range, because Fibonacci numbers get larger.

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

      Wow that's an easy solution.

      I solved it with two pointers and sets to find dp[L] which gives you the leftmost right border so that this interval havs a valid triangle .. and then in the quereies I see if dp[L]<=R and I print the triple .. and it passed :D .. I don't think the writera meant my solution.

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

        How did you calculate dp[L] ?

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

          you keep moving with the right pointer until you have found a triangle ... but how know that you found one?

          You have two sets, one for the lengths of the current interval, and one for saving the 3 indices that form a triangle (there may be more than one triple).

          Then when you move one step to the right you add this length to the lengths set and you see it's neighbors one to the right, one to the left, two to the right and two to the left and try to form triangle with them. If some triple forms a triangle you add it to the second set with the minimum index first to sort them by index.

          So when the second set is not empty that means that you have found a triple so you can stop, and by that you have found the leftmost R that you can form a triangle with.

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

            I think we can improve a bit this approach. We can store only one triangle and there is always be R index. When move left border we must check only existence triangle with R (if one of the indexes was L). If no such triangle move R.

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

      I learned this idea from the editorial of 766B.

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

      But we should get first 100 sorted elements in range [L;R] (using segment tree for example), isn't it?

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

        you don't have to, for each query sort the first min(100, size) elements in temporary array. , it's fast enough to pass the time limit.

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

i have 2 questions on yesterday's yandex. 1: can some one plz give me a proof for why this solution for c works. https://ide.geeksforgeeks.org/dkwmWVvF88

2: And i used segment tree for d in which i find the 3 maximum elements in a segment. And if those 3 cant form a triangle, print -1. But it doesnt work. failure on last test case. here is the code https://ide.geeksforgeeks.org/KsnMcNWu6K

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

    2: How did you decide that choosing the largest 3 elements will be sufficient?

    Counter-case 3,4,5,10

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

    For C, the answer is n^((n-1)^2) because after you fill the top-left (n-1)x(n-1) submatrix with anything, there is exactly one way to fill the remaining cells so that the matrix is valid.

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

      Can you proof that the rightest lower cell would be always correct ? UPD: oh, i understood why is it works )

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

        can you elaborate it

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

          1) Consider the top-left (n-1)x(n-1) submatrix 2) The sum of right column will be equal of sum of those elements plus the rightest lower cell 3) The sum of the bottom row will be equal the same => exactly one way to fill value to the last cell.

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

            how do you say that there exists one way. why cant you have 0 ways?. no number to fill it. cuz these 2 sequences are entirely different and how adding those integers will give the same number modulo n.

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

              We should proof, that sum of bottom row is equal to sum elements of right column.

              an, 1 + an, 2 + ... + an, n ≡ a1, n + ... + an, n (n), we can sub from both sums an, n

              Let's proof it.

              => they both contain top-left (n-1)x(n-1) submatrix => the sums are equals => there's exist a value for an, n

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

      Another way to explain: you can fill all cells except for main diagonal with any values. After that you can set the desired values to the main diagonal elements.

      UPD. This solution is wrong. But it led me to a correct formula due to the double mistake. Thanks God, I'm an idiot!

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

        main diagonal?

        for all cells except the both diagonals, doesn't it?

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

          I don't think either idea works, you can't fill center in these cases for N=3 [_,1,1] [1,_,1] [1,2,_] or [_,1,_] [1,_,1] [_,2,_]

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

А какой самый простой способ решить B? А то я строил двудольный граф, брал одну долю; а потом еще надо отсортировать правильно... В общем, это заняло минут 10, а как решить быстрее и проще?

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

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

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

    я считал, что первая последовательность, это какой-то столбец. И как только при считывания встречалось число из этого столбца, записывал всю строку.

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

После регионального этапа Всероссийской олимпиады и многих других контестов на системе Я.Контест мне хочется задать её разработчикам ряд вопросов:

  • Сколько вы знаете тестирующих систем, в которых таблица обновляется больше 30 секунд?

  • Почему вы посчитали, что постраничный standings — это удобно? Вам не кажется, что командам из нижней части таблицы и их тренерам это просто чудовищно неудобно?

  • Немалоизвестный проект codeforces почти со дня своего основания выводил notification о выборе подходящего спецификатора из %lld и %I64d, а потом это и вовсе перестало иметь значение. Как думаете, имеет смысл последовать примеру старшего братика?

  • Возвращаясь к теме standings, отмечу, что это дело личных предпочтений, но лично мне нынешний дизайн таблицы результатов в Я.Контесте кажется максимально неудобным. Я ищу любую возможность найти альтернативный standings, если существует такая возможность. Может реализуете возможность, при наличии соответствующих прав у участника или тренера, обращаться к contest log, например, если он у вас доступен в формате xml или аналогичном?

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

    Спасибо за фидбек.

    1. Других не знаю

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

    3. Вывести уведомление?

    4. У администраторов есть возможность через API выгружать стандартный лог контеста.

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

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

      Привет, Лидия. Спасибо за ответ! Не могу же я знать, кому и какой конкретно вопрос адресовать. Но у такого рода формы обращения есть существенное преимущество — люди, например Golovanov399, могут поделиться тем, как мне проще пережить боль. Давай вернёмся к фантастической четвёрке вопросов.

      1. Понятно.

      2. А как справляются другие системы? Например, opencup предоставляет такую табличку, PCMS2, Timus, да и многие другие проверяющие системы.

      3. Ну, хотя бы так. Но у codeforces, как я полагаю, спецификатор автоматически корректируется.

      4. А участникам или тренерам, которые имеют право просматривать таблицу, возможно предоставить API или, хотя бы, уже готовый лог?

      • »
        »
        »
        »
        6 лет назад, # ^ |
          Проголосовать: нравится +37 Проголосовать: не нравится
        1. Codechef, например
        2. Вроде бы ни одна из приведенных систем не проводит контесты на 500+ участников
      • »
        »
        »
        »
        6 лет назад, # ^ |
          Проголосовать: нравится +1 Проголосовать: не нравится

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

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

    Пункт 3. А какие компиляторы все еще не работают с %lld? Кажется, это часть стандарта c++11.

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

      Именно такой спецификатор подарил мне несколько брёвен на квалификационном раунде. Если я не ошибаюсь, то только c++11 там и был.

      UPD. В том смысле, что я писал %I64d, а надо было %lld.

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

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

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

          Раньше на Codeforces было строго наоборот. Думаю, что тут речь идёт не о любой системе, а именно о Я.Контесте, который сейчас внедряется абсолютно повсеместно. И, насколько мне известно, Яндекс является самой крупной и известной IT-компанией на прострах СНГ, а их тестирующая система во многом отстаёт от конкурентов, даже в таких мелочах. Разве не возникает желания это исправить?

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

            CodeForces использовал полукривой компилятор, который не поддерживал более распространённый %lld, а поддерживал мсовский I64d.

            Сейчас %lld уже 7 лет как стандартизирован и лет пять как поддерживается всеми компиляторами. Пора уже забыть про существование чего-то другого (или cin использовать, да).

            А варнинг с false-positive, который мешает сдать задачу побыстрее нафиг не нужен.

            PS: ты использовал квал по назначению и познакомился с системой. good for you

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

              Я не представляю сценарий, при котором warning будет с false-positive, да ещё и замедлит отправку. Ну будет высвечен где-то над или под кнопочкой отправки, как мешает-то это? И вообще, я слабо представляю ситуацию, когда в коде будет строка, содержащая "%I64d", но это не будет являться тем, чем ожидается.

              • »
                »
                »
                »
                »
                »
                »
                »
                6 лет назад, # ^ |
                Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится
                #ifdef MYOLDMCACHINE
                // Я под мингв в 2008-м
                #define LLD "%I64d"
                #else
                #define LLD "%lld"
                #end
                
                scanf(LLD, &n)
                

                В пример ты приводил КФ и там был варнинг, который срабатывал после нажатия кнопки отправить (и реагировал на код подобный тому, что выше)

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

Any ideas why my solution of problem D gets WA on first test (though it passes the samples)? https://pastebin.com/iiMfq5fJ Maybe I misunderstood something