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

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

Друзья, всем привет!

Через несколько часов состоится очередное соревнование — Codeforces Round 112 для участников Div. 2, но традиционно остальные могут поучаствовать вне конкурса. Он был подготовлен небольшой командой авторов: я (NALP), Артем Рахов (RAD), Павел Холкин (HolkinPV). Как всегда с нами были Геральд Агапов (Gerald), Мария Белова (Delinur) и Михаил Мирзаянов (MikeMirzayanov).

Отдельно хотелось бы пожелать удачи моим сокомандникам, Артему Рахову и Иванову Максиму (e-maxx), которые на днях улетели в США для принятия участия в онсайд-раунде Facebook HackerCup.

Мы надеемся, что сегодняшние задачи понравятся всем участникам, и каждый займет заслуженное высокое место в итоговой таблице :)

UPD: Соревнование завершилось, всем спасибо за участие :) Мы надеемся, что вам понравилось.

UPD: Друзья, предлагаю всем ознакомиться с разбором задач: http://codeforces.me/blog/entry/4124

UPD: Поздравляем победителей!

  1. Doriam30

  2. woshisb

  3. Senjougahara_Hitagi

  4. LiWenHaoTianXiaDiYi

  5. pqxdcel

  6. UranusX

  7. QDkAc

Полные результаты доступны по ссылке: http://codeforces.me/contest/165/standings

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

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

Артему удачи!

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

желаю всем зла

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

All the best to all of us. :)

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

Разбаловка стандартная?

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

    Если скажут 1500-1500-2000-2500-3000 даже пробовать решать не будешь?

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

Пытаюсь с вкладки "отослать" отправить не файл, а код. Получаю окошко с багом =(

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

Почему у меня при нажатии на кнопку "комната" отображается комната №1 второго дивизиона?

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

    Да, тот же баг, комнаты в пер. диве руками искать нужно.

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

Blog about match with A, B and C explanations

This was a fun problem set, thanks.

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

Может, есть мысли, как D и E решались? Не минусуйте только.

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

    D — Dynamic Connectivity Problem в почти чистом виде.

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

      из пушки по воробьям, не?

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

        В чем-то Вы правы, но мне ничего сильно проще не придумалось, я и написала DCP.

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

          если честно, я тоже бы написал, если знал)

          самое прикольное, что перед контестом начал это разбирать и не успел

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

    На что вы рассчитывали, когда писали, чтобы вас не минусовали?=)

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

    Скорее всего в Д как-то используется тот факт, что заданный граф — борода:) Я делал так же, как и для общего случая — красил ребра и смотрел чтоб количество покрашенных на пути было 0, когда отвечаю на запрос третьего типа.

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

      Ну факт, что граф -- борода, позволяет нам просто на пути его разбить, не зная H-L. Просто возьмем вершину, со степенью > 2 и разобьем от неё по различным путям, а дальше как обычно.

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

        Обидно, что не заметил.... Но такую задачу можно решать и без ХЛ, да и кода не больше будет, чем если разбивать на пути.

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

          А как ребра красил/проверял?

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

            Через Эйлеровое представление дерева: добавляем вершину в список при входе в дфс, и при выходе из каждого ее сына. При этом храним для каждого ребра его номер в списке прямых и обратных ребер дфс. Если хранить адрес первого вхождения вершины в список, то на отрезке first[x]..first[y] все ребра будут иметь свою пару (то есть для каждого закрытого будет открытое), такой пары не будет только у ребер, что лежат непосредственно на пути от х до у. Как-то так в общем:) http://e-maxx.ru/algo/tree_painting Должно работать, хотя еще не прошло:)

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

          Для каждого пути можно завести дерево Фенвика.

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

            Серьезно?

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

            Я перенумеровал вершины (корень — 1, дальше — ДФС), завел одно дерево отрезков, а дальше, видимо, как у тебя идея.

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

What is this message? -> "Judge protocol is inaccessible." (I got this message when I tried to hack.)

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

Аццкая D, полконтеста на поиски баги. Если кому интересно, 4 претест содержит запрос на расстояние в котором a = b = корень.

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

    Мда, а в это время все решали E.

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

      +1

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

      Да ну, гораздо интереснее (уж как минимум при внеконкурсном участии) читать E->D->C->B->A.

      Как минимум, пока пишется что-то простое, в фоне можно придумать что-то сложное.

      Заодно, если несколько самых сложных задач не нравятся, можно вовремя решить не участвовать.

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

Спасибо за очень интересные задачи )

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

During the contest today, I kept getting WA on pretest 11, during the last 5 minutes (in desperation :P) I spammed a bunch of (long long) (I used C++) wherever i had calculations going on and then i got pretests passed. All my variables were already long longs anyway, can someone please explain what might have happened? much thanks.

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

Any hint on problem D?

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

    I tried using Fenwick's tree. I couldn't finish it in time so I don't know whether that method would have been successful.

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

      Fenwick's tree (or another tree) should be OK for this problem.

      We have root (vertex with largest degree) and some paths from root.

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

        I used Fenwick's tree and got Accepted in less than 1000ms. What you should do is just to maintain some paths from root.

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

          I run a DFS from the root through the paths and give each node a unique ID. For example, root node has ID 1, then first path has IDs 2, 3, 4, 5, 6, 7, second path has IDs 8, 9, 10, 11, third path 12, 13, 14 etc.

          Also, for each node I calculated the distance between it and the root node.

          When an edge is colored white, I call fwt_update(x, 1) where x is the ID of the node right after this edge. When the egde is colored black, I call fwt_update(x, -1).

          When asked to tell about the SP between nodes X and Y, there are two cases. Lets assume that Y is further from root than X.

          If both X and Y are on the same path, I can express the number of white edges between them as fwt_read(Y) — fwt_read(X — 1).

          If X and Y are on different paths, I similarly check if there are any white edges between root and X as well as between root and Y.

          Am I right about the idea?

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

            Yeah, your solution is very perfect and convenient,thank you! I got a Accepted that I delete the root and for each chain build a Fenwick tree.Also my code is very long.

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

      Can anyone please explain why beard graph has to be a tree. 1->2->3->1 satisfies as a beard graph but is not a tree. Please correct me if I am wrong

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

    Let the vertex who has the maximum degree be root,if we delete the root,there will be several chains.For each chain,build a segment tree to maintain it.

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

как решалась Е?

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

As it seems E has surprisingly short solution.

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

    Does anyone know where could I read about the method used in solving E?

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

      I couldn't solve problem E in time but had a solution in mind. It involved converting each element of the array to its binary form->reverse it and then create a trie type DS (binary tree in this case). the height of this would at max be 20. Along this trie I also store information of when an element of the array ends in a particular node(call this val A). As well as a information at each node which tells any one of the numbers whioch would be discoverable in the path following(call this val B). Then for each number in the array I travel the Trie. Convert the number to binary and reverse it and then travel it from the front. For each 1 I take the 0 path. For a 0 I search in both path's. DFS in this process should work. If the search string ends at a particular node I return the val B else if any val A is found first before the search string ends I return the val A

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

        Most probably it will time out, as the DFS is not guaranteed to stop very soon.

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

      To solve the problem E, you may can just use the dynamic programming. dp[i] = dp[j], if j is sub-state of i and dp[j] != 0 ( 1100(2), 0110(2), 1010(2), 1000(2), 0100(2), 0010(2) are all sub-state of 1110(2), but you can just use 1100(2), 0110(2), 1010(2) to transfer dp).In the beginning, you just let dp[a[i]] = a[i], the others equal to 0. Finally, you can get answer from dp[(1 << 22) — 1 — a[i]], because (1 << 22) — 1 — a[i] is sub-state of ~a[i] and if (1 << 22) — 1 — a[i] has none-zero's sub-state, dp[(1 << 22) — 1 — a[i]] must not equal to 0.

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

use long long, instead of int... shouldn't make such a trivial mistake! :(

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

When will raintings be updated ?

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

Проявились недочеты в системе подсчета рейтинга. Вот два участника: Gantz и NCoder , первый был выше и выступил лучше, а в итоге оказался ниже. Несправедливо.

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

    Все верно т.к. gants изначально имел 1530 рейтинга,а NCoder 1500,поэтому от первого ждали место выше,чем от 2,а в данном случаи разрыв минимален,и следовательно первому дали поменьше рейтинга,чем второму.

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

      Пусть два участника участвовали в двух контестах. Вначале рейтинг обоих был 1530. Первый контест. Первый из участников выступил "так себе", и его рейтинг остался 1530. А второй слил и стал 1500. Второй контест. Оба участника выступили хорошо, причем первый лучше второго, но в итоге его рейтинг стал ниже, чем у второго, в соответствии с системой переоценки рейтинга. Получается, что участник, который два раза выступил хуже, оценивается более высоким рейтингом. Вот и недочет.

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

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

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

          Не знал, спасибо. А иначе это действительно выглядело бы странно.

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

Thanks for contest. I like the problems, B and C are good for hacks, but unfortunately I stucked on C :-(

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

Thanks for contest,E is a good problem, I think for a long time,very happy finally solved。And problem D with problem ——Query on a tree is very similar。:-D

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

В топ-50 подавляющее большинство фэйков -_- у которых в истории по 1-2 контеста

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

    Кто бы про фейки говорил. Сам то вместе с Serzhan читеришь за будь здоров. Взять хотя бы прошлый Div. 2. Решения по C:

    Battle_Mage:

    1367614

    Serzhan:

    1367087

    И это не единичный случай далеко.

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

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

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

      То есть это тебя смущает, а то, что в топ 10 только 2 аккаунта похожи на реальные — это нормально?

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

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

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

          Сравни ТОП-10 div2 в дни, когда раунды для обоих дивизионов, и дни, когда div2 only.

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

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

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

              Разница и в более старых раундах видна. За примером далеко бегать не надо — 111ый раунд.

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

                111 и 112 — действительно, согласен. В нескольких до них не особо заметно. Не считаешь, что наплыв участников мог быть связан с анонсом VK cup?

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

          стрелки кидать — это называется)

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

Editorial??

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

Waiting for the editorial eagerly. Hope it will be published soon.

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

sorry

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

    I think it's because of pow(), never use it if you work with integer numbers.

    This gets Accepted:

    long long int p = k;
    while(total1 != 0){
        total1 = mid / p;
        total = total + total1;
        p = p * k;
    }